home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 4 / Amiga Tools 4.iso / grafix / tools / playfkiss / src / playfkiss.e < prev    next >
Text File  |  1996-02-26  |  107KB  |  4,553 lines

  1. /*
  2. *
  3. * PlayFKiss: The Next Generation
  4. *
  5. * PUBLIC DOMAIN, written by Chad Randall (crandall@msen.com)
  6. *               Please send comments, flames, and kiss sets!
  7. *
  8. * Feb. 1, 1996
  9. *
  10. */
  11.  
  12. OPT LARGE
  13. OPT PREPROCESS
  14. OPT OSVERSION=37
  15.  
  16. MODULE                                'dos/dos','dos/dosextens','dos/notify','dos/dosextens','dos/dosasl'
  17. MODULE                                'exec/memory','exec/lists','exec/nodes'
  18. MODULE                                'graphics/rastport','graphics/gfx','graphics/text','graphics/scale',
  19.                                             'graphics/view','graphics/gfxbase','graphics/clip','graphics/layers',
  20.                                             'graphics/displayinfo','graphics/regions'
  21. MODULE                                'intuition/intuition','intuition/screens','intuition/gadgetclass',
  22.                                             'intuition/screens','intuition/pointerclass',
  23.                                             'intuition/classes', 'intuition/icclass','intuition/imageclass',
  24.                                             'intuition/cghooks'
  25.  
  26. MODULE    'asl',                'libraries/asl'
  27. MODULE    'cybergraphics','cybergraphics/cybergraphics'
  28. MODULE    'datatypes',    'datatypes/datatypes','datatypes/datatypesclass','datatypes/soundclass',
  29.                                             'datatypes/pictureclass'
  30. MODULE                                'devices/inputevent'
  31. MODULE    'keymap'
  32. MODULE    'icon'
  33. MODULE    'iffparse',        'libraries/iffparse'
  34. MODULE    'gadtools',        'libraries/gadtools'
  35. MODULE    'layers'
  36. MODULE    'rexxsyslib',    'rexx/rexxio','rexx/rxslib','rexx/errors','rexx/storage'
  37. MODULE    'utility',        'utility/tagitem','utility/date'
  38. MODULE    'xpkmaster','libraries/xpk'
  39. MODULE    'wb',                    'workbench/workbench','workbench/startup'
  40.  
  41. MODULE    'amigalib/lists'
  42. MODULE    'tools/easygui'
  43. MODULE    'tools/async'
  44. MODULE    'mod/pool'
  45. MODULE    'mod/lists'
  46. MODULE    'mod/filenames'
  47. MODULE    'mod/fonts'
  48. MODULE    'mod/compare'
  49. MODULE    'mod/bitmaps'
  50. MODULE    'mod/menus'
  51. MODULE    'mod/bits'
  52. MODULE    'mod/gadgets'
  53. MODULE    'mod/rexx'
  54. MODULE    'mod/ports'
  55.  
  56. ENUM MAXOBJS=800,MAXOBJS_1,MAXOBJS_2
  57. ENUM MAXCELS=1000,MAXCELS_1,MAXCELS_2
  58. ENUM HORIZ_GID=1,VERT_GID,LEFT_GID,RIGHT_GID,UP_GID,DOWN_GID
  59.  
  60. ENUM CMAP_SHOW=0,CMAP_HIDE,CMAP_GRAB
  61. ENUM MENU_NONE=0,MENU_QUIT,MENU_REDRAW,MENU_ABOUT,MENU_PREFS,MENU_CLOSE,
  62.             MENU_SAVE,MENU_SAVEALL,MENU_REVEAL,
  63.             MENU_OBJWIN,MENU_RESETOBJ,MENU_UNFIXOBJ,MENU_UNDO,MENU_REFIXOBJ,
  64.             MENU_MOVEBACK,MENU_MOVEFORWARD,
  65.             MENU_SAVESCREEN,MENU_PATROL,MENU_RESETSET,
  66.             MENU_SET0,MENU_SET1,MENU_SET2,MENU_SET3,MENU_SET4,
  67.             MENU_SET5,MENU_SET6,MENU_SET7,MENU_SET8,MENU_SET9,
  68.             MENU_CSET0,MENU_CSET1,MENU_CSET2,MENU_CSET3,MENU_CSET4,
  69.             MENU_CSET5,MENU_CSET6,MENU_CSET7,MENU_CSET8,MENU_CSET9
  70. ENUM QUIT_NONE=0,QUIT_QUIT,QUIT_CLOSE
  71.  
  72. ENUM GH_MAIN,GH_PREFS,GH_EDITOR
  73.  
  74. ENUM REG_OBJ=0,REG_CEL,REG_NONE
  75.  
  76. ENUM EV_UNKNOWN=0,EV_INIT,EV_BEGIN,EV_END,EV_ALARM,EV_CATCH,EV_UNFIX,EV_FIXCATCH,EV_SET,EV_DROP,EV_PRESS,EV_RELEASE,EV_FIXDROP
  77. ENUM CO_UNKNOWN=0,CO_TIMER,CO_MAP,CO_UNMAP,CO_SOUND,CO_MOVE,CO_SET,CO_ALTMAP
  78.  
  79. CONST FILE_MARK_CELL=$20,FILE_MARK_PALET=$10
  80. CONST    GS1_MAX_COLOR=16,GS2_MAX_COLOR=256,GS3_MAX_COLOR=256,GS4_MAX_COLOR=256
  81.  
  82. OBJECT pi_gauge OF plugin
  83.     string:PTR TO CHAR
  84.     curlevel:LONG
  85.     top:LONG
  86.     x:INT
  87.     y:INT
  88.     w:INT
  89.     h:INT
  90. ENDOBJECT
  91.  
  92. OBJECT event
  93.     ln:ln
  94.     commands:lh
  95.     type:LONG
  96.     obj:LONG
  97.     cel:PTR TO CHAR
  98.     counter:LONG
  99. ENDOBJECT
  100.  
  101. OBJECT command
  102.     ln:ln
  103.     type:LONG
  104.     obj:LONG
  105.     cel:PTR TO CHAR
  106.     x,y:LONG
  107.     sound:LONG
  108. ENDOBJECT
  109.  
  110. OBJECT cel PUBLIC
  111.     realname:PTR TO CHAR
  112.     comment:PTR TO CHAR
  113.     w:INT
  114.     h:INT
  115.     ox:INT
  116.     oy:INT
  117.     sets[11]:ARRAY
  118.     buf:PTR TO CHAR
  119.     obuf:PTR TO CHAR
  120.     obj:INT
  121.     fix:INT
  122.     palet_num:CHAR
  123.     mapped:CHAR
  124.     bit_per_pixel:CHAR
  125. ->    imbuf:PTR TO imbuf
  126. ->    mask:PTR TO imbuf
  127. ENDOBJECT
  128.  
  129. OBJECT obj PUBLIC
  130.     number:LONG
  131.     comment:PTR TO CHAR
  132.     numcels:LONG
  133.     fix:INT
  134.     oldfix:INT
  135.     lastx,lasty:INT
  136.     rubx,ruby:INT
  137.     x[11]:ARRAY OF INT
  138.     y[11]:ARRAY OF INT
  139.     ux[11]:ARRAY OF INT
  140.     uy[11]:ARRAY OF INT
  141. ENDOBJECT
  142.  
  143. OBJECT paleto
  144.     name:PTR TO CHAR
  145.     format:CHAR
  146.     palet_num:CHAR
  147.     bit_per_pixel:CHAR
  148.     color_num:INT
  149. ->    pb[10]:ARRAY OF INT
  150.     color[18]:ARRAY OF LONG
  151. ENDOBJECT
  152. OBJECT listnodes;lh:lh;ENDOBJECT
  153.  
  154. DEF palet[20]:ARRAY OF paleto
  155. DEF mode,palset=0
  156.  
  157. DEF animspeed=100,usebounds=FALSE,usehand=FALSE
  158. DEF tanimspeed=100,tusebounds=FALSE,tusehand=FALSE
  159. DEF useregions=REG_OBJ,tuseregions
  160. DEF usefollow=FALSE,tusefollow
  161. DEF usesnap=FALSE,tusesnap
  162. DEF usenasty=FALSE,tusenasty
  163. DEF usecgfx=FALSE
  164. DEF usewb=TRUE,tusewb,onwb=FALSE
  165. DEF usewin=FALSE,tusewin
  166.  
  167. DEF objs[MAXOBJS_2]:LIST
  168. DEF cels[MAXCELS_2]:LIST
  169.  
  170. DEF horizgadget:PTR TO object,vertgadget:PTR TO object
  171. DEF leftgadget:PTR TO object,rightgadget:PTR TO object
  172. DEF upgadget:PTR TO object,downgadget:PTR TO object
  173. DEF offx=0,offy=0
  174.  
  175. DEF rexxport,rexxsigbit,rexxname[150]:STRING
  176. DEF rexxhand:PTR TO rexx_handle
  177. DEF tempdir[500]:STRING
  178. DEF oldafile[500]:STRING
  179.  
  180. DEF pppp:PTR TO pi_gauge
  181.  
  182. DEF sizeimage:PTR TO image,leftimage:PTR TO image,rightimage:PTR TO image
  183. DEF upimage:PTR TO image,downimage:PTR TO image
  184.  
  185. DEF modeid=69632,tmodeid,modename
  186. DEF screenos=0,tscreenos
  187. DEF screenas=TRUE,tscreenas
  188. DEF prefhand:PTR TO guihandle
  189. DEF sname[200]:STRING
  190.  
  191. DEF apens[260]:LIST,bgpen=-1
  192.  
  193. DEF inputevent:PTR TO inputevent
  194.  
  195. DEF revealpick
  196.  
  197. DEF pb[12]:LIST
  198.  
  199. DEF envw=640,envh=480
  200. DEF backcolor=0
  201.  
  202. DEF fkissfound=0
  203.  
  204. DEF hand1,hand2,hand3,hand4
  205. DEF hbm1:PTR TO bitmap,hbm2:PTR TO bitmap,hbm3:PTR TO bitmap,hbm4:PTR TO bitmap
  206.  
  207. DEF linenum=1
  208. DEF gh=0:PTR TO guihandle
  209. DEF objh=0:PTR TO guihandle,lastobj=0:PTR TO obj,lastcel=0:PTR TO cel
  210. DEF objwtext,objhtext,objftext,objmtext,objntext,objxtext,objytext
  211. DEF celntext,celnnum,celxtext,celytext,celwtext,celhtext
  212.  
  213. DEF evgad,cogad,events,commands
  214.  
  215. DEF win:PTR TO window
  216. DEF scr:PTR TO screen,depth
  217. DEF dri:PTR TO drawinfo
  218. DEF disp:PTR TO rastport
  219. DEF vis,cm,vp:PTR TO viewport,rp:PTR TO rastport
  220. DEF menu
  221.  
  222. DEF filereq=0:PTR TO filerequester
  223.  
  224. DEF ezclist:PTR TO listnodes
  225. DEF errlist:PTR TO listnodes
  226.  
  227. DEF eventlist:PTR TO lh
  228.  
  229. DEF temprp=0:PTR TO rastport
  230. DEF tempbitmap=0:PTR TO bitmap
  231.  
  232. DEF ofilename[500]:STRING
  233. DEF smr=NIL:PTR TO screenmoderequester
  234.  
  235. DEF curset=-1,curpal=0
  236.  
  237. DEF curcel:PTR TO cel,curobj:PTR TO obj,catchobj:PTR TO obj
  238.  
  239. ->DEF dragbuf:PTR TO imbuf,maskbuf:PTR TO imbuf
  240. DEF dragw,dragh,olddragx,olddragy,dragox,dragoy,dragx,dragy
  241.  
  242. DEF gbuf=0:PTR TO CHAR
  243.  
  244. DEF region=0:PTR TO region
  245.  
  246. DEF setloaded=0
  247.  
  248. DEF afname[500]:STRING
  249. DEF nobjgad,ncelgad,cellistv,cellistgad,colgad
  250. DEF errlistv,errlistgad
  251. DEF memgad,totmem=0
  252. DEF playgad,ppgad
  253. DEF quitgad,qqgad
  254. DEF getgad,afnamegad
  255. DEF ghgetgad,ghafnamegad
  256.  
  257. DEF continue,stepon
  258.  
  259. DEF wx[10]:LIST,wy[10]:LIST,ww[10]:LIST,wh[10]:LIST
  260.  
  261. PROC sizewin(win:PTR TO window,type)
  262.     IF usewin=0 THEN RETURN
  263. ->    ChangeWindowBox(win,wx[type],wy[type],ww[type],wh[type])
  264.     MoveWindow(win,wx[type]-win.leftedge,wy[type]-win.topedge)
  265.     SizeWindow(win,ww[type]-win.width,wh[type]-win.height)
  266. ENDPROC
  267.  
  268. PROC rememberwin(win:PTR TO window,type)
  269.     IF usewin=0 THEN RETURN
  270.     wx[type]:=win.leftedge
  271.     wy[type]:=win.topedge
  272.     ww[type]:=win.width
  273.     wh[type]:=win.height
  274. ENDPROC
  275.  
  276. PROC placecel(cel:PTR TO cel,x,y,ex,ey,ew,eh)
  277.     DEF a1:PTR TO CHAR,a2:PTR TO CHAR
  278.     DEF mod1,mod2
  279.     DEF sx,sy,dx,dy,i,t,aa,bb,cc
  280.     DEF rw,rh
  281.     IF (ex<0)
  282.         ew:=ew+ex
  283.         ex:=0
  284.     ENDIF
  285.     IF (ey<0)
  286.         eh:=eh+ey
  287.         ey:=0
  288.     ENDIF
  289.     IF ((ew+ex)>envw)
  290.         ew:=envw-ex
  291.     ENDIF
  292.     IF ((ey+eh)>envh)
  293.         eh:=envh-ey
  294.     ENDIF
  295.  
  296.     rw:=cel.w            -> Width of cel memblock to copy
  297.     rh:=cel.h
  298.     sx:=0                    -> Top-left corner of source cel memblock
  299.     sy:=0
  300.     dx:=x+cel.ox    -> Top-left corner in gbuf to place cel
  301.     dy:=y+cel.oy
  302.     IF (dx<=ex)
  303.         sx:=(ex-dx)
  304.         rw:=rw-(ex-dx)
  305.         dx:=ex
  306.     ENDIF
  307.     IF (dy<=ey)
  308.         sy:=(ey-dy)
  309.         rh:=rh-(ey-dy)
  310.         dy:=ey
  311.     ENDIF
  312.     IF ((dx+rw)>=(ex+ew))
  313.         rw:=rw-((dx+rw)-(ex+ew))+1
  314.     ENDIF
  315.     IF ((dy+rh)>=(ey+eh))
  316.         rh:=rh-((dy+rh)-(ey+eh))+1
  317.     ENDIF
  318.     a1:=cel.buf+(cel.w*sy)+sx
  319.     a2:=gbuf+(dy*envw)+dx
  320.     mod1:=cel.w-rw
  321.     mod2:=envw-rw
  322.     rw:=rw-1
  323.     rh:=rh-1
  324.  
  325.     IF ((rw>=0) AND (rh>=0))
  326.         IF ((a2>=gbuf) AND (envw>0))
  327.             IF rw>0    
  328.                 IF rh>0
  329.                     bb:=cel.w
  330.                     MOVEM        A0-A2/D0-D7,-(A7)        -> E seems to use a few of these variables. :(
  331.                     MOVE.L    rh,D1            -> outside loop (height)
  332.                     MOVE.L    bb,D5            -> celwidth
  333.                     MOVE.L    envw,D6        -> environment width
  334.                     MOVE.L    rw,D7            -> real width to copy
  335.  
  336.                     CLR.L        D4                -> D4 is used with bytes
  337.                     MOVE.L    a1,D2            -> these point to left side of cel,env
  338.                     MOVE.L    a2,D3
  339.  
  340. loopt:
  341.                     MOVE.L    D7,D0            -> inside loop (width)
  342.                     MOVE.L    D2,A1            -> grab left side of cel,env
  343.                     MOVE.L    D3,A2
  344. loopi:
  345.  
  346.                     MOVE.B    (A1)+,D4    -> get source byte
  347.                     BEQ.S        zerobyte    -> if zero, skip
  348.                     MOVE.B    D4,(A2)        -> else store it
  349.  
  350. zerobyte:
  351.  
  352.                     ADDA.L    #1,A2            -> inc storage pointer by one
  353.                     DBRA.S    D0,loopi    -> finish inside loop
  354.  
  355.                     ADD.L        D5,D2            -> point to one line below current
  356.                     ADD.L        D6,D3
  357.  
  358.                     DBRA.S    D1,loopt    -> finish outside loop
  359.                     MOVEM        (A7)+,A0-A2/D0-D7
  360.  
  361. /*        THIS IS THE OLD FUNCTION, WHICH TOOK 3 TIMES AS LONG!
  362.                     FOR t:=0 TO rh
  363.                         FOR i:=0 TO rw
  364.                             aa:=a1[i]
  365.                             IF aa
  366.                                 a2[i]:=aa
  367.                             ENDIF
  368.                         ENDFOR
  369.                         a1:=a1+bb
  370.                         a2:=a2+envw
  371.                     ENDFOR
  372. */
  373.                 ENDIF
  374.             ENDIF
  375.             IF a2<gbuf
  376.                 DisplayBeep(0)
  377.                 WriteF('TRASHED MEMORY!\n')
  378.             ENDIF
  379.             IF a2>(gbuf+(envw*3)+(envw*envh)+1)
  380.                 DisplayBeep(0)
  381.                 WriteF('TRASHED MEMORY! \h bytes\n',(a2-(gbuf+(envw*envh)+envw)))
  382.             ENDIF
  383.         ELSE
  384.             DisplayBeep(0)
  385.             WriteF('Almost trashed with: (\d,\d)-(\d,\d) \n',dx,dy,rw,rh)
  386.         ENDIF
  387.     ENDIF
  388. ENDPROC
  389.  
  390. PROC parseargs()
  391.     DEF rdarg=0,args[10]:LIST,i
  392.     DEF wb:PTR TO wbstartup /* startup message from Workbench */
  393.     DEF wbargs:PTR TO wbarg   /* argument list struct.  We get a passed project */
  394.     DEF wbdir[500]:STRING
  395.     DEF olddir
  396.  
  397.     FOR i:=0 TO 9
  398.         args[i]:=0
  399.     ENDFOR
  400.     IF wbmessage=NIL
  401.         rdarg:=ReadArgs('FILE',args,0)
  402.         IF rdarg
  403.             IF args[0]<>0
  404.                 StrCopy(ofilename,args[0],ALL)
  405.             ENDIF
  406.         ENDIF
  407.     ELSE
  408.         wb:=wbmessage
  409.         wbargs:=wb.arglist
  410.         wbargs:=wbargs+SIZEOF wbarg
  411.         IF wb.numargs>1
  412.             olddir:=CurrentDir(wbargs.lock)
  413.             GetCurrentDirName(wbdir,250)
  414.             StrCopy(ofilename,wbdir,ALL)
  415.             eaddpart(ofilename,wbargs.name,499)
  416.             CurrentDir(olddir)
  417.         ENDIF
  418.     ENDIF
  419. ENDPROC
  420.  
  421. PROC main() HANDLE
  422.     DEF i,cel:PTR TO cel,tt,goon
  423.     DEF dumstr[100]:STRING
  424.     NEW palet[16]
  425.     NEW temprp;InitRastPort(temprp)
  426.     NEW eventlist;newList(eventlist)
  427.     NEW inputevent
  428.  
  429.     loadprefs('ENV:playfkiss.prefs')
  430.     FOR i:=0 TO 15;palet[i].name:=String(500);ENDFOR
  431.     FOR i:=1 TO 255;apens[i]:=-1;ENDFOR;apens[0]:=0;bgpen:=-1
  432.     IF (rexxsysbase:=OpenLibrary('rexxsyslib.library',0))=NIL THEN Raise("REXL")
  433.     IF (iffparsebase:=OpenLibrary('iffparse.library',37))=0 THEN Raise("IFFP")
  434.     IF (keymapbase:=OpenLibrary('keymap.library',37))=0 THEN Raise("KEYM")
  435.     IF (utilitybase:=OpenLibrary('utility.library',37))=0 THEN Raise("UTIL")
  436.     IF (gadtoolsbase:=OpenLibrary('gadtools.library',37))=0 THEN Raise("GT")
  437.     IF (aslbase:=OpenLibrary('asl.library',37))=0 THEN Raise("ASL")
  438.     IF (layersbase:=OpenLibrary('layers.library',39))=0 THEN Raise("LAY")
  439.     IF (datatypesbase:=OpenLibrary('datatypes.library',39))=0 THEN Raise("DT")
  440. ->WriteF('a')
  441.     xpkbase:=OpenLibrary('xpkmaster.library',2)
  442.     cybergfxbase:=OpenLibrary('cybergraphics.library',40)
  443. ->WriteF('b')
  444.     getpointers()
  445. ->WriteF('c')
  446.     region:=NewRegion()
  447. ->WriteF('d')
  448.     smr:=AllocAslRequest(ASL_SCREENMODEREQUEST,[ASLSM_PUBSCREENNAME,'Workbench',ASLSM_DODEPTH,FALSE,ASLSM_DOWIDTH,FALSE,ASLSM_DOHEIGHT,FALSE,ASLSM_DOOVERSCANTYPE,TRUE,ASLSM_DOAUTOSCROLL,TRUE,NIL])
  449.     filereq:=AllocAslRequest(ASL_FILEREQUEST,[ASLFR_INITIALPATTERN,'(#?.CNF|#?.LHA|#?.LZH|#?.LZX)',NIL,NIL])
  450. ->WriteF('e')
  451.     FOR i:=0 TO MAXOBJS;objs[i]:=0;ENDFOR
  452.     FOR i:=0 TO MAXCELS;cels[i]:=0;ENDFOR
  453. ->WriteF('f')
  454.     StrCopy(afname,'Kiss:')
  455.     StrCopy(ofilename,'Kiss:')
  456.     parseargs()
  457. ->WriteF('g')
  458.     goon:=QUIT_CLOSE
  459.     WHILE goon=QUIT_CLOSE
  460. ->WriteF('h')
  461.         setloaded:=0
  462.         IF loadcnf()=1
  463. ->WriteF('*')
  464.             IF setloaded
  465.                 prekiss()
  466.                 tempbitmap:=AllocBitMap(1024,1,8,BMF_CLEAR,scr.rastport.bitmap)
  467.                 temprp.bitmap:=tempbitmap
  468.                 ready()
  469. ->WriteF('`')
  470.                 goon:=playkiss()
  471.                 postkiss()
  472.             ENDIF
  473.         ELSE
  474.             goon:=QUIT_QUIT
  475.         ENDIF
  476.         IF StrLen(afname)
  477.             splitname(afname,ofilename,dumstr)
  478.         ENDIF
  479.         IF (StrLen(ofilename)>0) THEN StrAdd(ofilename,'/')
  480.     ENDWHILE
  481. EXCEPT DO
  482.     SELECT exception
  483.     CASE 0;NOP
  484.     CASE "REXL";err('Missing rexxsyslib.library')
  485.     CASE "KEYM";err('Missing keymap.library')
  486.     CASE "UTIL";err('Missing utility.library')
  487.     CASE "GT";err('Missing gadtools.library')
  488.     CASE "ASL";err('Missing asl.library')
  489.     CASE "LAY";err('Missing layers.library')
  490.     CASE "DT";err('Missing datatype.library')
  491.     CASE "IFFP";err('Missing iffparse.library')
  492.     CASE "MEM";err('Not enough memory.')
  493.     CASE "Egui";err('EasyGUI error.')
  494.     CASE "bigg";err('EasyGUI too big!')
  495.     CASE "SCR";err('Can\at open screen.')
  496.     CASE "WIN";err('Can\at open window.')
  497.     CASE "MENU";err('Can\at create menu.')
  498.     CASE "VIS";err('Can\t obtain visual structure.')
  499.     CASE "file";err('File error.')
  500.     CASE "err";err('Misc. error?')
  501.     ENDSELECT
  502. ->WriteF('1')
  503.     postkiss()
  504. ->WriteF('2')
  505.     freepointers()
  506. ->WriteF('3')
  507.     freecels()
  508. ->WriteF('4')
  509.     freeobjs()
  510. ->WriteF('5')
  511.     freepals()
  512. ->WriteF('6')
  513.     freeevents()
  514. ->WriteF('7')
  515.     IF region THEN DisposeRegion(region)
  516. ->WriteF('8')
  517.     IF smr THEN FreeAslRequest(smr)
  518.     IF filereq THEN FreeAslRequest(filereq)
  519.     savewinpos()
  520.     IF tempbitmap THEN FreeBitMap(tempbitmap)
  521.  
  522.     IF rexxsysbase THEN CloseLibrary(rexxsysbase)
  523.     IF iffparsebase THEN CloseLibrary(iffparsebase)
  524.     IF keymapbase THEN CloseLibrary(keymapbase)
  525.     IF utilitybase THEN CloseLibrary(utilitybase)
  526.     IF gadtoolsbase THEN CloseLibrary(gadtoolsbase)
  527.     IF aslbase THEN CloseLibrary(aslbase)
  528.     IF layersbase THEN CloseLibrary(layersbase)
  529.     IF datatypesbase THEN CloseLibrary(datatypesbase)
  530.     IF xpkbase THEN CloseLibrary(xpkbase)
  531.     IF cybergfxbase THEN CloseLibrary(cybergfxbase)
  532. ENDPROC
  533.  
  534. PROC getpointers()
  535.     NEW hbm1,hbm2,hbm3,hbm4
  536.     hbm1.bytesperrow:=2
  537.     hbm1.rows:=15
  538.     hbm1.depth:=2
  539.     hbm1.planes[0]:={hand1dataa}
  540.     hbm1.planes[1]:={hand1datab}
  541.     hbm2.bytesperrow:=2
  542.     hbm2.rows:=15
  543.     hbm2.depth:=2
  544.     hbm2.planes[0]:={hand2dataa}
  545.     hbm2.planes[1]:={hand2datab}
  546.     hbm3.bytesperrow:=2
  547.     hbm3.rows:=1
  548.     hbm3.depth:=2
  549.     hbm3.planes[0]:={hand3dataa}
  550.     hbm3.planes[1]:={hand3datab}
  551.     hbm4.bytesperrow:=2
  552.     hbm4.rows:=15
  553.     hbm4.depth:=2
  554.     hbm4.planes[0]:={hand4dataa}
  555.     hbm4.planes[1]:={hand4datab}
  556.     hand1:=NewObjectA(NIL,'pointerclass',[POINTERA_BITMAP,hbm1,
  557.                             POINTERA_XOFFSET,-1,
  558.                             POINTERA_YOFFSET,-1,
  559.                             POINTERA_XRESOLUTION,POINTERXRESN_SCREENRES,
  560.                             POINTERA_YRESOLUTION,POINTERYRESN_SCREENRESASPECT,
  561.                             NIL,NIL])
  562.     hand2:=NewObjectA(NIL,'pointerclass',[POINTERA_BITMAP,hbm2,
  563.                             POINTERA_XOFFSET,-3,
  564.                             POINTERA_YOFFSET,-3,
  565.                             POINTERA_XRESOLUTION,POINTERXRESN_SCREENRES,
  566.                             POINTERA_YRESOLUTION,POINTERYRESN_SCREENRESASPECT,
  567.                             NIL,NIL])
  568.     hand3:=NewObjectA(NIL,'pointerclass',[POINTERA_BITMAP,hbm3,
  569.                             POINTERA_XRESOLUTION,POINTERXRESN_HIRES,
  570.                             POINTERA_YRESOLUTION,POINTERYRESN_HIGH,
  571.                             POINTERA_XOFFSET,0,
  572.                             POINTERA_YOFFSET,0,
  573.                             NIL,NIL])
  574.     hand4:=NewObjectA(NIL,'pointerclass',[POINTERA_BITMAP,hbm4,
  575.                             POINTERA_XRESOLUTION,POINTERXRESN_SCREENRES,
  576.                             POINTERA_YRESOLUTION,POINTERYRESN_SCREENRESASPECT,
  577.                             POINTERA_XOFFSET,-6,
  578.                             POINTERA_YOFFSET,-6,
  579.                             NIL,NIL])
  580. ENDPROC
  581.  
  582. PROC freepointers()
  583.     IF hand1 THEN DisposeObject(hand1)
  584.     IF hand2 THEN DisposeObject(hand2)
  585.     IF hand3 THEN DisposeObject(hand3)
  586.     IF hand4 THEN DisposeObject(hand4)
  587. ENDPROC
  588. PROC changeset(newset)
  589.     DEF ev=0
  590.     IF (curset=newset) THEN RETURN
  591.     ev:=findeventtype(EV_SET,newset)
  592.     curset:=newset
  593.     changepal(pb[curset])
  594.     IF ev
  595.         runcommands(ev)
  596.     ENDIF
  597.     check(menu,MENU_SET0,FALSE)
  598.     check(menu,MENU_SET1,FALSE)
  599.     check(menu,MENU_SET2,FALSE)
  600.     check(menu,MENU_SET3,FALSE)
  601.     check(menu,MENU_SET4,FALSE)
  602.     check(menu,MENU_SET5,FALSE)
  603.     check(menu,MENU_SET6,FALSE)
  604.     check(menu,MENU_SET7,FALSE)
  605.     check(menu,MENU_SET8,FALSE)
  606.     check(menu,MENU_SET9,FALSE)
  607.     SELECT curset
  608.         CASE 0;check(menu,MENU_SET0,TRUE)
  609.         CASE 1;check(menu,MENU_SET1,TRUE)
  610.         CASE 2;check(menu,MENU_SET2,TRUE)
  611.         CASE 3;check(menu,MENU_SET3,TRUE)
  612.         CASE 4;check(menu,MENU_SET4,TRUE)
  613.         CASE 5;check(menu,MENU_SET5,TRUE)
  614.         CASE 6;check(menu,MENU_SET6,TRUE)
  615.         CASE 7;check(menu,MENU_SET7,TRUE)
  616.         CASE 8;check(menu,MENU_SET8,TRUE)
  617.         CASE 9;check(menu,MENU_SET9,TRUE)
  618.     ENDSELECT
  619. ENDPROC
  620. PROC changepal(newpal)
  621.     check(menu,MENU_CSET0,FALSE)
  622.     check(menu,MENU_CSET1,FALSE)
  623.     check(menu,MENU_CSET2,FALSE)
  624.     check(menu,MENU_CSET3,FALSE)
  625.     check(menu,MENU_CSET4,FALSE)
  626.     check(menu,MENU_CSET5,FALSE)
  627.     check(menu,MENU_CSET6,FALSE)
  628.     check(menu,MENU_CSET7,FALSE)
  629.     check(menu,MENU_CSET8,FALSE)
  630.     check(menu,MENU_CSET9,FALSE)
  631.     curpal:=limit(newpal,0,9)
  632.     SELECT curpal
  633.         CASE 0;check(menu,MENU_CSET0,TRUE)
  634.         CASE 1;check(menu,MENU_CSET1,TRUE)
  635.         CASE 2;check(menu,MENU_CSET2,TRUE)
  636.         CASE 3;check(menu,MENU_CSET3,TRUE)
  637.         CASE 4;check(menu,MENU_CSET4,TRUE)
  638.         CASE 5;check(menu,MENU_CSET5,TRUE)
  639.         CASE 6;check(menu,MENU_CSET6,TRUE)
  640.         CASE 7;check(menu,MENU_CSET7,TRUE)
  641.         CASE 8;check(menu,MENU_CSET8,TRUE)
  642.         CASE 9;check(menu,MENU_CSET9,TRUE)
  643.     ENDSELECT
  644.     updatecolors()
  645. ENDPROC
  646.  
  647. PROC moveback()    -> celnum:=celnul-1
  648.     DEF cn=-1,i
  649.     DEF cel:PTR TO cel
  650.     DEF swapcel:PTR TO cel
  651.     IF ((lastcel<>0) AND (lastobj<>0))
  652.         FOR i:=0 TO MAXCELS
  653.             cel:=cels[i]
  654.             IF cel=lastcel
  655.                 cn:=i
  656.             ENDIF
  657.         ENDFOR
  658.     ENDIF
  659.     IF (cn>0)
  660.         swapcel:=cels[cn-1]
  661.         IF swapcel
  662.             i:=cels[cn-1]
  663.             cels[cn-1]:=cels[cn]
  664.             cels[cn]:=i
  665.             prechange()
  666.             orcel(lastcel,lastobj)
  667.             postchange()
  668.             updateobjwin()
  669.         ENDIF
  670.     ENDIF
  671. ENDPROC
  672.  
  673. PROC moveforward()    -> celnum:=celnum+1
  674.     DEF cn=-1,i
  675.     DEF cel:PTR TO cel
  676.     DEF swapcel:PTR TO cel
  677.     prechange()
  678.     IF ((lastcel<>0) AND (lastobj<>0))
  679.         FOR i:=0 TO MAXCELS
  680.             cel:=cels[i]
  681.             IF cel=lastcel
  682.                 cn:=i
  683.             ENDIF
  684.         ENDFOR
  685.     ENDIF
  686.     IF ((cn>-1) AND (cn<MAXCELS))
  687.         swapcel:=cels[cn+1]
  688.         IF swapcel
  689.             i:=cels[cn+1]
  690.             cels[cn+1]:=cels[cn]
  691.             cels[cn]:=i
  692.             prechange()
  693.             orcel(lastcel,lastobj)
  694.             postchange()
  695.             updateobjwin()
  696.         ENDIF
  697.     ENDIF
  698. ENDPROC
  699.  
  700. PROC hidecel()
  701.     IF lastcel
  702.         lastcel.setset(curset,0)
  703.         prechange()
  704.         orcel(lastcel,lastobj)
  705.         postchange()
  706.         updateobjwin()
  707.     ENDIF
  708. ENDPROC
  709.  
  710. PROC openobjwin()
  711.     IF objh THEN RETURN
  712.     objh:=guiinit('Editor',
  713.         [ROWS,
  714.             [COLS,
  715.                 [BEVELR,
  716.                     [ROWS,
  717.                         [COLS,
  718.                             [EQROWS,
  719.                                 objntext:=[NUM,MAXOBJS,'Obj:',0,1],
  720.                                 objwtext:=[NUM,1024,'Width:',0,1],
  721.                                 objxtext:=[NUM,1024,'X:',0,1],
  722.                                 [SBUTTON,{resetcur},'Reset']
  723.                             ],
  724.                             [EQROWS,
  725.                                 objmtext:=[NUM,1024,'Cels:',0,1],
  726.                                 objhtext:=[NUM,1024,'Height:',0,1],
  727.                                 objytext:=[NUM,1024,'Y:',0,1],
  728.                                 [SBUTTON,{undo},'Undo']
  729.                             ]
  730.                         ],
  731.                         [BAR],
  732.                         [ROWS,
  733.                             [COLS,
  734.                                 objftext:=[INTEGER,{setslidefix},'Fix:',327680,5],
  735.                                 [BUTTON,{storefixcur},'Store']
  736.                             ],
  737.                             [EQCOLS,                            
  738.                                 [SBUTTON,{resetfixcur},'Reset'],
  739.                                 [SBUTTON,{unfixcur},'Unfix']
  740.                             ]
  741.                         ]
  742.                     ]
  743.                 ],
  744.                 [BEVELR,
  745.                     [ROWS,
  746.                         celnnum:=[NUM,MAXCELS,'Cel:',0,1],
  747.                         celntext:=[TEXT,'NONAMEYET.CEL','Name:',FALSE,1],
  748.                         [COLS,
  749.                             [EQROWS,
  750.                                 celxtext:=[NUM,1024,'OffsetX:',0,1],
  751.                                 [SPACEH],
  752.                                 celwtext:=[NUM,1024,'Width:',0,1]
  753.                             ],
  754.                             [EQROWS,
  755.                                 celytext:=[NUM,1024,'OffsetY:',0,1],
  756.                                 [SPACEH],
  757.                                 celhtext:=[NUM,1024,'Height:',0,1]
  758.                             ]
  759.                         ],
  760.                         [BAR],
  761.                         [EQCOLS,
  762.                             [BUTTON,{moveback},'Back'],
  763.                             [BUTTON,{moveforward},'Forward'],
  764.                             [BUTTON,{hidecel},'Hide']
  765.                         ]
  766.                     ]
  767.                 ]
  768.             ]
  769.         ]
  770.     ,0,scr)
  771.     sizewin(objh.wnd,GH_EDITOR)
  772.     updateobjwin()
  773. ENDPROC
  774.  
  775. PROC setslidefix(a,val)
  776.     IF (lastobj)
  777.         lastobj.setfix(val)
  778.     ENDIF
  779. ENDPROC
  780.  
  781. PROC updateobjwin()
  782.     DEF w=0,h=0,i,cel:PTR TO cel,obj:PTR TO obj
  783.     DEF cn=-1
  784.     IF objh
  785.         IF ((lastobj<>0) AND (lastcel<>0))
  786.             FOR i:=0 TO MAXCELS
  787.                 cel:=cels[i]
  788.                 IF cel
  789.                     IF (cel=lastcel)
  790.                         cn:=MAXCELS-i
  791.                     ENDIF
  792.                 ENDIF
  793.             ENDFOR
  794.             setnum(objh,objwtext,lastobj.width())
  795.             setnum(objh,objhtext,lastobj.height())
  796.             setnum(objh,objmtext,lastobj.countmembers())
  797.             setinteger(objh,objftext,lastobj.fix)
  798.             setnum(objh,objntext,lastobj.number)
  799.             setnum(objh,objxtext,lastobj.x[curset])
  800.             setnum(objh,objytext,lastobj.y[curset])
  801.             setnum(objh,celnnum,cn)
  802.             settext(objh,celntext,lastcel.realname)
  803.             setnum(objh,celxtext,lastcel.ox)
  804.             setnum(objh,celytext,lastcel.oy)
  805.             setnum(objh,celwtext,lastcel.w)
  806.             setnum(objh,celhtext,lastcel.h)
  807.         ELSE
  808.             setnum(objh,objwtext,-1)
  809.             setnum(objh,objhtext,-1)
  810.             setnum(objh,objmtext,-1)
  811.             setinteger(objh,objftext,0)
  812.             setnum(objh,objntext,-1)
  813.             setnum(objh,objxtext,-1)
  814.             setnum(objh,objytext,-1)
  815.  
  816.             setnum(objh,celnnum,-1)
  817.             settext(objh,celntext,'N/A')
  818.             setnum(objh,celxtext,-1)
  819.             setnum(objh,celytext,-1)
  820.             setnum(objh,celwtext,-1)
  821.             setnum(objh,celhtext,-1)
  822.         ENDIF
  823.     ENDIF
  824. ENDPROC
  825.  
  826. PROC prekiss()
  827.     DEF res=0
  828.     openscr()
  829. ENDPROC res
  830.  
  831. PROC revealp(a,val)
  832.     revealpick:=val
  833. ENDPROC
  834.  
  835. PROC reveal()
  836.     DEF lh:PTR TO listnodes
  837.     DEF i,cel:PTR TO cel,obj:PTR TO obj
  838.     DEF str[500]:STRING
  839.     DEF rgh
  840.     DEF actual=-1,ii=-1
  841.  
  842.     NEW lh.new()
  843.     FOR i:=0 TO MAXCELS
  844.         cel:=cels[i]
  845.         IF cel
  846.             IF cel.sets[curset]=0
  847.                 StringF(str,'#\d[4] "\s"',MAXCELS-i,cel.realname)
  848.                 lh.add(str)
  849.             ENDIF
  850.         ENDIF
  851.     ENDFOR
  852.     IF isempty(lh.head())=0
  853.         revealpick:=-1
  854.         rgh:=easygui('Reveal which cel?',
  855.             [ROWS,
  856.                 [LISTV,{revealp},0,16,8,lh.head(),FALSE,1,0],
  857.                 [EQCOLS,
  858.                     [SBUTTON,2,'Ok'],
  859.                     [SBUTTON,0,'Cancel']
  860.                 ]
  861.             ],0,scr)
  862.         IF (rgh>0) AND (revealpick>-1)
  863.             FOR i:=0 TO MAXCELS
  864.                 cel:=cels[i]
  865.                 IF cel
  866.                     IF cel.sets[curset]=0
  867.                         actual:=actual+1
  868.                         IF (actual=revealpick)
  869.                             ii:=i
  870.                         ENDIF
  871.                     ENDIF
  872.                 ENDIF
  873.             ENDFOR
  874.             IF ii>-1
  875.                 cel:=cels[ii]
  876.                 IF cel
  877.                     obj:=objs[cel.obj]
  878.                     IF obj
  879.                         cel.setset(curset,1)
  880.                         prechange()
  881.                         orcel(cel,obj)
  882.                         postchange()
  883.                         updateobjwin()
  884.                     ENDIF
  885.                 ENDIF
  886.             ENDIF
  887.         ENDIF                
  888.     ENDIF
  889.     END lh
  890. ENDPROC
  891.  
  892. PROC playkiss()
  893.     DEF i,cel:PTR TO cel,obj:PTR TO obj
  894.     DEF mes:PTR TO intuimessage,quit=QUIT_NONE
  895.     DEF class,code,item:PTR TO menuitem
  896.     DEF select
  897.     DEF ev=0,rrre
  898.     DEF minx,miny
  899.     DEF sig,oldtop,w,h
  900.  
  901.     curset:=-1
  902.     lastcel:=0;lastobj:=0;curobj:=0;curcel:=0;catchobj:=0
  903.     runevent(EV_INIT,0,0)
  904.     runevent(EV_BEGIN,0,0)
  905.     changeset(0)
  906.     rrre:=-1
  907.     WHILE quit=QUIT_NONE
  908.         sig:=Wait(-1)
  909.         IF (sig AND SIGBREAKF_CTRL_C) THEN quit:=QUIT_QUIT
  910.         IF objh
  911.             rrre:=guimessage(objh)
  912.             IF rrre>=0
  913.                 rememberwin(objh.wnd,GH_EDITOR)
  914.                 cleangui(objh)
  915.                 objh:=0
  916.             ENDIF
  917.         ENDIF
  918.         WHILE (mes:=GetMsg(win.userport))
  919.             class:=mes.class
  920.             SELECT class
  921.             CASE IDCMP_CLOSEWINDOW
  922.                 quit:=QUIT_QUIT
  923.             CASE IDCMP_NEWSIZE
  924.                 updatescroll()
  925.             CASE IDCMP_IDCMPUPDATE
  926.                 code:=GetTagData(GA_ID,0,mes.iaddress)
  927.                 SELECT code
  928.                     CASE HORIZ_GID
  929.                         updatescroll()
  930.                     CASE VERT_GID
  931.                         updatescroll()
  932.                     CASE LEFT_GID
  933.                         GetAttr(PGA_TOP,horizgadget,{oldtop})
  934.                         w:=recalchvisible()
  935.                         h:=recalcvvisible()
  936.                         IF oldtop>0
  937.                             updateprop(horizgadget,PGA_TOP,oldtop-1)
  938.                           GetAttr(PGA_TOP,horizgadget,{offx})
  939.                           updatelistbuffered(offx,offy,w,h)
  940.                         ENDIF
  941.                     CASE RIGHT_GID
  942.                         GetAttr(PGA_TOP,horizgadget,{oldtop})
  943.                         w:=recalchvisible()
  944.                         h:=recalcvvisible()
  945.                         IF oldtop<(envw-w)
  946.                             updateprop(horizgadget,PGA_TOP,oldtop+1)
  947.                           GetAttr(PGA_TOP,horizgadget,{offx})
  948.                           updatelistbuffered(offx,offy,w,h)
  949.                         ENDIF
  950.                     CASE UP_GID
  951.                         GetAttr(PGA_TOP,vertgadget,{oldtop})
  952.                         w:=recalchvisible()
  953.                         h:=recalcvvisible()
  954.                         IF oldtop>0
  955.                             updateprop(vertgadget,PGA_TOP,oldtop-1)
  956.                           GetAttr(PGA_TOP,vertgadget,{offy})
  957.                           updatelistbuffered(offx,offy,w,h)
  958.                         ENDIF
  959.                     CASE DOWN_GID
  960.                         GetAttr(PGA_TOP,vertgadget,{oldtop})
  961.                         w:=recalchvisible()
  962.                         h:=recalcvvisible()
  963.                         IF oldtop<(envh-h)
  964.                             updateprop(vertgadget,PGA_TOP,oldtop+1)
  965.                           GetAttr(PGA_TOP,vertgadget,{offy})
  966.                           updatelistbuffered(offx,offy,w,h)
  967.                         ENDIF
  968.                 ENDSELECT
  969.             CASE IDCMP_MENUVERIFY
  970.                 ClearPointer(win)
  971.                 dropobj(olddragx+dragox,olddragy+dragoy)
  972.             CASE IDCMP_MENUPICK
  973.                 code:=mes.code
  974.                 WHILE code<>MENUNULL
  975.                     IF (item:=ItemAddress(menu,code))
  976.                         select:=Long(item+34)
  977.                         SELECT select
  978.                         CASE MENU_ABOUT
  979.                             aboutme()
  980.                         CASE MENU_REDRAW
  981.                             updatelist()
  982.                         CASE MENU_QUIT
  983.                             quit:=QUIT_QUIT
  984.                         CASE MENU_PREFS
  985.                             prefs()
  986.                         CASE MENU_OBJWIN
  987.                             IF objh=0
  988.                                 openobjwin()
  989.                             ELSE
  990.                                 rememberwin(objh.wnd,GH_EDITOR)
  991.                                 cleangui(objh);objh:=0
  992.                             ENDIF
  993.                         CASE MENU_CLOSE;quit:=QUIT_CLOSE
  994.                         CASE MENU_SET0;changeset(0)
  995.                         CASE MENU_SET1;changeset(1)
  996.                         CASE MENU_SET2;changeset(2)
  997.                         CASE MENU_SET3;changeset(3)
  998.                         CASE MENU_SET4;changeset(4)
  999.                         CASE MENU_SET5;changeset(5)
  1000.                         CASE MENU_SET6;changeset(6)
  1001.                         CASE MENU_SET7;changeset(7)
  1002.                         CASE MENU_SET8;changeset(8)
  1003.                         CASE MENU_SET9;changeset(9)
  1004.                         CASE MENU_CSET0;changepal(0)
  1005.                         CASE MENU_CSET1;changepal(1)
  1006.                         CASE MENU_CSET2;changepal(2)
  1007.                         CASE MENU_CSET3;changepal(3)
  1008.                         CASE MENU_CSET4;changepal(4)
  1009.                         CASE MENU_CSET5;changepal(5)
  1010.                         CASE MENU_CSET6;changepal(6)
  1011.                         CASE MENU_CSET7;changepal(7)
  1012.                         CASE MENU_CSET8;changepal(8)
  1013.                         CASE MENU_CSET9;changepal(9)
  1014.                         CASE MENU_RESETOBJ;resetcur()
  1015.                         CASE MENU_UNFIXOBJ;unfixcur()
  1016.                         CASE MENU_REFIXOBJ;refixcur()
  1017.                         CASE MENU_UNDO;undo()
  1018.                         CASE MENU_SAVE;appendcoords(afname)
  1019.                         CASE MENU_SAVEALL;saveall(afname)
  1020.                         CASE MENU_REVEAL;reveal()
  1021.                         CASE MENU_MOVEBACK;moveback()
  1022.                         CASE MENU_MOVEFORWARD;moveforward()
  1023.                         CASE MENU_SAVESCREEN;savescreen(afname)
  1024.                         CASE MENU_PATROL;patrol()
  1025.                         CASE MENU_RESETSET;resetset()
  1026.                         ENDSELECT
  1027.                         code:=item.nextselect
  1028.                     ELSE
  1029.                         code:=MENUNULL
  1030.                     ENDIF
  1031.                 ENDWHILE
  1032.                 handme()
  1033.             CASE IDCMP_VANILLAKEY
  1034.                 select:=mes.code
  1035.                 SELECT select
  1036.                 CASE "0";changepal(0)
  1037.                 CASE "1";changepal(1)
  1038.                 CASE "2";changepal(2)
  1039.                 CASE "3";changepal(3)
  1040.                 CASE "4";changepal(4)
  1041.                 CASE "5";changepal(5)
  1042.                 CASE "6";changepal(6)
  1043.                 CASE "7";changepal(7)
  1044.                 CASE "8";changepal(8)
  1045.                 CASE "9";changepal(9)
  1046.                 CASE 27;quit:=QUIT_QUIT
  1047.                 CASE "-";moveback()
  1048.                 CASE "=";moveforward()
  1049.                 CASE "+";moveforward()
  1050.                 CASE "f";unfixcur()
  1051.                 CASE "F";refixcur()
  1052.                 CASE "u";undo()
  1053.                 CASE "w"
  1054.                     IF objh=0
  1055.                         openobjwin()
  1056.                     ELSE
  1057.                         rememberwin(objh.wnd,GH_EDITOR)
  1058.                         cleangui(objh);objh:=0
  1059.                     ENDIF
  1060.                 ENDSELECT
  1061. ->        WriteF('V \d \h\n',mes.code,mes.code)
  1062.             CASE IDCMP_RAWKEY
  1063.                 select:=mes.code
  1064.                 SELECT select
  1065.                 CASE 80;changeset(0)
  1066.                 CASE 81;changeset(1)
  1067.                 CASE 82;changeset(2)
  1068.                 CASE 83;changeset(3)
  1069.                 CASE 84;changeset(4)
  1070.                 CASE 85;changeset(5)
  1071.                 CASE 86;changeset(6)
  1072.                 CASE 87;changeset(7)
  1073.                 CASE 88;changeset(8)
  1074.                 CASE 89;changeset(9)
  1075.                 ENDSELECT
  1076. ->        WriteF('R \d \h\n',mes.code,mes.code)
  1077.             CASE IDCMP_MOUSEBUTTONS
  1078.                 IF mes.code=MENUDOWN
  1079.                     noreportmousemoves(win)
  1080.                     dropobj(olddragx+dragox,olddragy+dragoy)
  1081.                 ENDIF
  1082.                 IF mes.code=SELECTUP
  1083.                     noreportmousemoves(win)
  1084.                     handme()
  1085.                     dropobj(mes.mousex,mes.mousey)
  1086.                 ENDIF
  1087.                 IF mes.code=SELECTDOWN
  1088.                     cel,obj:=findobj(mes.mousex-win.borderleft+offx,mes.mousey-win.bordertop+offy)
  1089.                     IF obj>=0
  1090.                         lastobj:=obj
  1091.                         lastcel:=cel
  1092.                         lastobj.remember(curset)
  1093.                     ENDIF
  1094.                     curobj:=0
  1095.                     curcel:=0
  1096.                     catchobj:=0
  1097.                     IF ((cel>=0) AND (obj>=0))
  1098.                         IF obj.fix=1
  1099.                             obj.setfix(0)
  1100.                         ELSE
  1101.                             IF (obj.fix>1)
  1102.                                 obj.setfix(bigger(obj.fix-1,0))
  1103.                                 IF (obj.fix<(obj.oldfix-1)) THEN IF (runevent(EV_FIXCATCH,obj,cel)) THEN catchobj:=obj
  1104.                                 SetWindowPointerA(win,[WA_POINTER,hand4,WA_POINTERDELAY,FALSE,NIL,NIL])
  1105.                             ENDIF
  1106.                         ENDIF
  1107.                         IF (runevent(EV_PRESS,obj,cel)) THEN catchobj:=obj
  1108.                         IF ((obj.fix<=0) OR ((usesnap<>FALSE) AND (obj.fix<6)))
  1109.                             IF obj.fix=0
  1110.                                 IF (runevent(EV_CATCH,obj,cel)) THEN catchobj:=obj
  1111.                             ENDIF
  1112.                             curobj:=obj;curcel:=cel
  1113.                             dragx:=obj.x[curset]
  1114.                             dragy:=obj.y[curset]
  1115.                             olddragx:=dragx
  1116.                             olddragy:=dragy
  1117.                             dragox:=mes.mousex-dragx
  1118.                             dragoy:=mes.mousey-dragy
  1119.                             reportmousemoves(win)
  1120.                             grabme()
  1121.                             pickupobj()
  1122.                         ENDIF
  1123.                     ENDIF
  1124.                     updateobjwin()
  1125.                 ENDIF
  1126.             CASE IDCMP_INTUITICKS
  1127.                 IF curobj=0
  1128.                     dectimers()
  1129.                 ELSE
  1130.                     curobj.move((IF usefollow THEN mes.mousex ELSE win.mousex)-dragox,(IF usefollow THEN mes.mousey ELSE win.mousey)-dragoy,TRUE)
  1131.                 ENDIF
  1132.             CASE IDCMP_MOUSEMOVE
  1133.                 IF curobj
  1134.                     curobj.move((IF usefollow THEN mes.mousex ELSE win.mousex)-dragox,(IF usefollow THEN mes.mousey ELSE win.mousey)-dragoy,TRUE)
  1135.                 ENDIF                
  1136.             ENDSELECT
  1137.             ReplyMsg(mes)
  1138.         ENDWHILE
  1139.     ENDWHILE
  1140.     IF objh
  1141.         rememberwin(objh.wnd,GH_EDITOR)
  1142.         cleangui(objh);objh:=0
  1143.     ENDIF
  1144.     runevent(EV_END,0,0)
  1145. ENDPROC quit
  1146.  
  1147. PROC patrol()
  1148.     DEF i,obj:PTR TO obj,eb
  1149.     eb:=usebounds
  1150.     usebounds:=TRUE
  1151.     busy()
  1152.     prechange()
  1153.     FOR i:=0 TO MAXOBJS
  1154.         obj:=objs[i]
  1155.         IF obj
  1156.             obj.movequick(obj.x[curset],obj.y[curset])
  1157.         ENDIF
  1158.     ENDFOR
  1159.     postchange()
  1160.     ready()
  1161.     usebounds:=eb
  1162. ENDPROC
  1163.  
  1164. PROC resetset()
  1165.     DEF i,obj:PTR TO obj,eb
  1166.     eb:=EasyRequestArgs(win,[20,0,'RESET ALL DATA','Selecting "Proceed" will loose all changes.',
  1167.         'Proceed|Cancel'],0,0)
  1168.     IF eb
  1169.         busy()
  1170.         prechange()
  1171.         FOR i:=0 TO MAXOBJS
  1172.             obj:=objs[i]
  1173.             IF obj
  1174.                 obj.movequick(obj.ux[curset],obj.uy[curset])
  1175.                 obj.setfix(obj.oldfix)
  1176.             ENDIF
  1177.         ENDFOR
  1178.         postchange()
  1179.         ready()
  1180.     ENDIF
  1181. ENDPROC
  1182.  
  1183. PROC unfixcur()
  1184.     IF lastobj
  1185.         lastobj.setfix(0)
  1186.         updateobjwin()
  1187.     ENDIF
  1188. ENDPROC
  1189.  
  1190. PROC refixcur() IS resetfixcur()
  1191.  
  1192. PROC storefixcur()
  1193.     IF lastobj
  1194.         lastobj.oldfix:=lastobj.fix
  1195.         updateobjwin()
  1196.     ENDIF
  1197. ENDPROC
  1198.  
  1199. PROC resetfixcur()
  1200.     IF lastobj
  1201.         lastobj.setfix(lastobj.oldfix)
  1202.         updateobjwin()
  1203.     ENDIF
  1204. ENDPROC
  1205.  
  1206. PROC resetcur()
  1207.     IF lastobj
  1208.         lastobj.remember(curset)
  1209.         lastobj.forcemove(lastobj.ux[curset],lastobj.uy[curset],TRUE)
  1210.     ENDIF
  1211. ENDPROC
  1212.  
  1213. PROC pickupobj()
  1214.     DEF cel:PTR TO cel
  1215.     DEF obj:PTR TO obj
  1216.     DEF ev,i
  1217.     IF curobj
  1218.         prechange()
  1219.         curobj.remember(curset)
  1220.         FOR i:=0 TO MAXCELS
  1221.             cel:=cels[i]
  1222.             IF cel
  1223.                 IF cel.sets[curset]
  1224.                     IF (cel.obj>=0)
  1225.                         obj:=objs[cel.obj]
  1226.                         IF (obj)
  1227.                             IF (obj=curobj)
  1228.                                 IF cel.mapped=CMAP_SHOW
  1229.                                     cel.mapped:=CMAP_GRAB
  1230.                                 ENDIF
  1231.                             ENDIF
  1232.                         ENDIF
  1233.                     ENDIF
  1234.                 ENDIF
  1235.             ENDIF
  1236.         ENDFOR
  1237.     ENDIF
  1238. ENDPROC
  1239.  
  1240. PROC dropobj(x,y)
  1241.     DEF cel:PTR TO cel
  1242.     DEF obj:PTR TO obj
  1243.     DEF ev,i
  1244.     IF curobj
  1245.         prechange()
  1246.         runevent(EV_RELEASE,curobj,curcel)
  1247.         IF curobj.fix=0
  1248.             runevent(EV_DROP,curobj,curcel)
  1249.         ELSE
  1250.             runevent(EV_FIXDROP,curobj,curcel)
  1251.         ENDIF
  1252.         IF curobj.fix>0
  1253.             curobj.move(curobj.rubx,curobj.ruby,FALSE)
  1254.         ELSE
  1255.             curobj.move(x-dragox,y-dragoy,FALSE)
  1256.         ENDIF
  1257.         FOR i:=0 TO MAXCELS
  1258.             cel:=cels[i]
  1259.             IF cel
  1260.                 IF (cel.obj>=0)
  1261.                     obj:=objs[cel.obj]
  1262.                     IF (obj)
  1263.                         IF (obj=curobj)
  1264.                             IF cel.mapped<>CMAP_HIDE
  1265.                                 cel.mapped:=CMAP_SHOW
  1266.                             ENDIF
  1267.                         ENDIF
  1268.                     ENDIF
  1269.                 ENDIF
  1270.             ENDIF
  1271.         ENDFOR
  1272.         postchange()
  1273.         IF (catchobj=curobj) THEN catchobj:=0
  1274.         curobj:=0
  1275.         curcel:=0
  1276.         dragox:=0
  1277.         dragoy:=0
  1278.     ENDIF
  1279.     IF catchobj
  1280.         runevent(EV_RELEASE,catchobj,cel)
  1281.         IF catchobj.fix=0
  1282.             runevent(EV_DROP,catchobj,cel)
  1283.         ELSE
  1284.             runevent(EV_FIXDROP,catchobj,cel)
  1285.         ENDIF
  1286.         catchobj:=0
  1287.     ENDIF
  1288.     updateobjwin()
  1289. ENDPROC
  1290.  
  1291. PROC undo()
  1292.     DEF x,y
  1293.     IF (lastobj<>0)
  1294.         lastobj.undo()
  1295.     ENDIF
  1296. ENDPROC
  1297.  
  1298. PROC findobj(x,y)
  1299.     DEF i
  1300.     DEF obj:PTR TO obj,cel:PTR TO cel
  1301.     FOR i:=MAXCELS TO 0 STEP -1
  1302.         cel:=cels[i]
  1303.         IF cel
  1304.             IF (cel.sets[curset])
  1305.                 IF (cel.mapped=CMAP_SHOW)
  1306.                     IF cel.buf
  1307.                         obj:=objs[cel.obj]
  1308.                         IF obj
  1309.                             IF x>=(obj.x[curset]+cel.ox)
  1310.                                 IF y>=(obj.y[curset]+cel.oy)
  1311.                                     IF x<(obj.x[curset]+cel.ox+cel.w)
  1312.                                         IF y<(obj.y[curset]+cel.oy+cel.h)
  1313.                                             IF cel.buf[(x-(obj.x[curset]+cel.ox))+((y-(obj.y[curset]+cel.oy))*cel.w)]
  1314. ->                            IF ReadPixel(cel.mask.rast,x-(obj.x[curset]+cel.ox),y-(obj.y[curset]+cel.oy))
  1315.                                                 RETURN cel,obj
  1316.                                             ENDIF
  1317.                                         ENDIF
  1318.                                     ENDIF
  1319.                                 ENDIF
  1320.                             ENDIF
  1321.                         ENDIF
  1322.                     ENDIF
  1323.                 ENDIF
  1324.             ENDIF
  1325.         ENDIF
  1326.     ENDFOR
  1327. ENDPROC -1,-1
  1328.  
  1329. PROC altmapcel(nu)
  1330.     DEF cel:PTR TO cel
  1331.     cel:=cels[nu]
  1332.     IF cel
  1333.         IF cel.mapped=CMAP_SHOW
  1334.             cel.mapped:=CMAP_HIDE
  1335.             erasecel(cel)
  1336.         ELSE
  1337.             cel.mapped:=CMAP_SHOW
  1338.             drawcel(cel,nu)
  1339.         ENDIF
  1340.     ENDIF
  1341. ENDPROC
  1342.  
  1343. PROC mapcel(nu)
  1344.     DEF cel:PTR TO cel
  1345.     cel:=cels[nu]
  1346.     IF cel
  1347.         IF cel.mapped<>CMAP_SHOW
  1348.             cel.mapped:=CMAP_SHOW
  1349.             drawcel(cel,nu)
  1350.         ENDIF
  1351.     ENDIF
  1352. ENDPROC
  1353.  
  1354. PROC unmapcel(nu)
  1355.     DEF cel:PTR TO cel
  1356.     cel:=cels[nu]
  1357.     IF cel
  1358.         IF cel.mapped<>CMAP_HIDE
  1359.             cel.mapped:=CMAP_HIDE
  1360.             erasecel(cel)
  1361.         ENDIF
  1362.     ENDIF
  1363. ENDPROC
  1364.  
  1365. PROC prechange()
  1366.     ClearRegion(region)
  1367. /*    globx1:=60000
  1368.     globy1:=60000
  1369.     globx2:=0
  1370.     globy2:=0*/
  1371. ENDPROC
  1372.  
  1373. PROC postchange()
  1374.     DEF cregion:PTR TO regionrectangle
  1375.     DEF x1,y1,minx1=60000,miny1=60000,maxx1=0,maxy1=0
  1376.     DEF bounds:PTR TO rectangle
  1377.  
  1378.     cregion:=region.regionrectangle
  1379.     IF region.bounds
  1380.         x1:=region.bounds.minx
  1381.         y1:=region.bounds.miny
  1382.         WHILE cregion
  1383.             bounds:=cregion.bounds
  1384.             IF (useregions<>REG_NONE)
  1385.                 updatelistbuffered(x1+bounds.minx,y1+bounds.miny,bounds.maxx-bounds.minx+1,bounds.maxy-bounds.miny+1,TRUE)
  1386.             ELSE
  1387.                 minx1:=smaller(minx1,x1+bounds.minx)
  1388.                 miny1:=smaller(miny1,y1+bounds.miny)
  1389.                 maxx1:=bigger(maxx1,x1+bounds.maxx)
  1390.                 maxy1:=bigger(maxy1,y1+bounds.maxy)
  1391.             ENDIF
  1392.             cregion:=cregion.next
  1393.         ENDWHILE
  1394.         ClearRegion(region)
  1395.         IF (useregions=REG_NONE)
  1396.             updatelistbuffered(minx1,miny1,maxx1-minx1+1,maxy1-miny1+1,TRUE)
  1397.         ENDIF
  1398.     ELSE
  1399.         WriteF('Empty region?!?\n');DisplayBeep(0)
  1400.     ENDIF
  1401. ENDPROC
  1402.  
  1403. PROC orcel(cel:PTR TO cel,obj:PTR TO obj,flag=FALSE)
  1404.     IF obj
  1405.         IF cel
  1406.             IF ((flag<>FALSE) AND (useregions=REG_OBJ))
  1407.                 OrRectRegion(region,[obj.x[curset],obj.y[curset],obj.x[curset]+obj.width(),obj.y[curset]+obj.height()]:rectangle)
  1408.             ELSE
  1409.                 OrRectRegion(region,[obj.x[curset]+cel.ox,obj.y[curset]+cel.oy,obj.x[curset]+cel.ox+cel.w,obj.y[curset]+cel.oy+cel.h]:rectangle)
  1410.             ENDIF
  1411.         ENDIF
  1412.     ENDIF
  1413. ENDPROC
  1414.  
  1415. PROC erasecel(cel:PTR TO cel)
  1416.     DEF obj:PTR TO obj
  1417.     IF cel=0;WriteF('zerocel!\n');RETURN;ENDIF
  1418.     obj:=objs[cel.obj]
  1419.     IF obj
  1420.         orcel(cel,obj)
  1421.     ENDIF
  1422. ENDPROC
  1423.  
  1424. PROC drawcel(cel:PTR TO cel,nu)
  1425.     DEF obj:PTR TO obj
  1426.     IF cel=0;WriteF('zerocel!\n');RETURN;ENDIF
  1427.     obj:=objs[cel.obj]
  1428.     IF obj
  1429.         orcel(cel,obj)
  1430.     ENDIF
  1431. ENDPROC
  1432.  
  1433. PROC updatelistbuffered(x,y,w,h,flag=FALSE) HANDLE
  1434.     DEF cel:PTR TO cel,obj:PTR TO obj
  1435.     DEF obx,oby
  1436.     DEF qox,qoy
  1437.     DEF t,a,i,yy,xx
  1438.     DEF ds1:PTR TO datestamp
  1439.     DEF ds2:PTR TO datestamp
  1440.     DEF ds3:PTR TO datestamp
  1441.  
  1442. ->WriteF('buffer-(\dx\d)-(\dx\d)   \n',x,y,w,h)
  1443.  
  1444.     IF (x<0)
  1445.         w:=w+x
  1446.         x:=0
  1447.     ENDIF
  1448.     IF (y<0)
  1449.         h:=h+y
  1450.         y:=0
  1451.     ENDIF
  1452.     IF ((w+x)>envw)
  1453.         w:=envw-x
  1454.     ENDIF
  1455.     IF ((y+h)>envh)
  1456.         h:=envh-y
  1457.     ENDIF
  1458.  
  1459.     IF ((w>0) AND (h>0))
  1460.         xx:=x+w-1
  1461.         yy:=y+h-1
  1462.         IF onwb
  1463.             FOR t:=y TO yy
  1464.                 a:=(envw*t)+x
  1465.                 FOR i:=x TO xx
  1466.                     gbuf[a]:=bgpen;a:=a+1
  1467.                 ENDFOR
  1468.             ENDFOR
  1469.         ELSE
  1470.             FOR t:=y TO yy
  1471.                 a:=(envw*t)+x
  1472.                 FOR i:=x TO xx
  1473.                     gbuf[a]:=0;a:=a+1
  1474.                 ENDFOR
  1475.             ENDFOR
  1476.         ENDIF
  1477.  
  1478.         FOR i:=0 TO MAXCELS
  1479.             cel:=cels[i]
  1480.             IF (cel)
  1481.                 IF (cel.sets[curset])
  1482.                     IF (cel.buf)
  1483.                         IF ((cel.mapped=CMAP_SHOW) OR ((cel.mapped=CMAP_GRAB) AND (flag<>0)))
  1484.                             obj:=objs[cel.obj]
  1485.                             IF (obj)
  1486.                                 obx:=obj.x[curset]
  1487.                                 oby:=obj.y[curset]
  1488.                                 qox:=cel.ox
  1489.                                 qoy:=cel.oy
  1490.                                 IF ((qox+obx)<=(x+w-1))
  1491.                                     IF ((qoy+oby)<=(y+h-1))
  1492.                                         IF ((qox+obx+cel.w-1)>=x)
  1493.                                             IF ((qoy+oby+cel.h-1)>=y)
  1494.                                                 placecel(cel,obx,oby,x,y,w,h)
  1495.                                             ENDIF
  1496.                                         ENDIF
  1497.                                     ENDIF
  1498.                                 ENDIF
  1499.                             ENDIF
  1500.                         ENDIF
  1501.                     ENDIF
  1502.                 ENDIF
  1503.             ENDIF
  1504.         ENDFOR
  1505.         IF ((usenasty<>0) AND (usecgfx<>0))
  1506.             WritePixelArray(gbuf,x-offx,y-offy,envw,rp,x,y,w,h,RECTFMT_LUT8)
  1507.         ELSE
  1508.             t:=gbuf+(y*envw)+x
  1509.             xx:=x-offx
  1510.             FOR i:=y TO y+h-1
  1511.                 WritePixelLine8(rp,xx,i-offy,w,t,temprp)
  1512.                 t:=t+envw
  1513.             ENDFOR
  1514.         ENDIF
  1515.     ENDIF
  1516. EXCEPT
  1517. WriteF('No memory!\n')
  1518.     updatelist()
  1519. ENDPROC
  1520.  
  1521. PROC updatelist(off=0,flag=TRUE)
  1522.     DEF i:REG,cel:PTR TO cel,obj:PTR TO obj,t:REG,a:REG
  1523.     a:=0
  1524.     busy()
  1525.     IF onwb
  1526.         FOR t:=0 TO envh-1
  1527.             FOR i:=0 TO envw-1
  1528.                 gbuf[a]:=bgpen;a:=a+1
  1529.             ENDFOR
  1530.         ENDFOR
  1531.     ELSE
  1532.         FOR t:=0 TO envh-1
  1533.             FOR i:=0 TO envw-1
  1534.                 gbuf[a]:=0;a:=a+1
  1535.             ENDFOR
  1536.         ENDFOR
  1537.     ENDIF
  1538.     FOR i:=off TO MAXCELS
  1539.         cel:=cels[i]
  1540.         IF cel
  1541.             IF cel.buf
  1542.                 IF cel.mapped=CMAP_SHOW OR ((cel.mapped=CMAP_GRAB) AND (flag<>0))
  1543.                     IF cel.sets[curset]
  1544.                         obj:=objs[cel.obj]
  1545.                         IF obj
  1546.                             placecel(cel,obj.x[curset],obj.y[curset],0,0,envw,envh)
  1547.                         ENDIF
  1548.                     ENDIF
  1549.                 ENDIF
  1550.             ENDIF
  1551.         ENDIF
  1552.     ENDFOR
  1553.  
  1554.     IF ((usenasty<>0) AND (usecgfx<>0))
  1555.         WritePixelArray(gbuf,0-offx,0-offy,envw,rp,0,0,envw,envh,RECTFMT_LUT8)
  1556.     ELSE
  1557.         FOR i:=0 TO envh-1
  1558.             WritePixelLine8(rp,0-offx,i-offy,envw,gbuf+(i*envw),temprp)
  1559.         ENDFOR
  1560.     ENDIF
  1561.     ready()
  1562. ENDPROC
  1563.  
  1564. PROC unmapobj(objn)
  1565.     DEF obj:PTR TO obj,cel:PTR TO cel,i
  1566.     obj:=objs[objn]
  1567.     IF obj
  1568.         FOR i:=0 TO MAXCELS
  1569.             cel:=cels[i]
  1570.             IF cel
  1571.                 IF cel.obj=objn
  1572.                     cel.mapped:=CMAP_HIDE
  1573.                 ENDIF
  1574.             ENDIF
  1575.         ENDFOR
  1576.         updateobj(obj,objn)
  1577.     ENDIF
  1578. ENDPROC
  1579.  
  1580. PROC mapobj(objn)
  1581.     DEF obj:PTR TO obj,cel:PTR TO cel,i
  1582.     obj:=objs[objn]
  1583.     IF obj
  1584.         FOR i:=0 TO MAXCELS
  1585.             cel:=cels[i]
  1586.             IF cel
  1587.                 IF cel.obj=objn
  1588.                     cel.mapped:=CMAP_SHOW
  1589.                 ENDIF
  1590.             ENDIF
  1591.         ENDFOR
  1592.         updateobj(obj,objn)
  1593.     ENDIF
  1594. ENDPROC
  1595.  
  1596. PROC altmapobj(objn)
  1597.     DEF obj:PTR TO obj,cel:PTR TO cel,i
  1598.     FOR i:=0 TO MAXCELS
  1599.         cel:=cels[i]
  1600.         IF cel
  1601.             IF cel.obj=objn
  1602.                 altmapcel(i)
  1603. /*
  1604.                 obj:=objs[cel.obj]
  1605.                 IF obj
  1606.                     IF cel.mapped=CMAP_HIDE
  1607.                         mapcel(i)
  1608.                     ELSE
  1609.                         unmapcel(i)
  1610.                     ENDIF
  1611.                     i:=MAXCELS_2
  1612.                 ENDIF
  1613. */
  1614.             ENDIF
  1615.         ENDIF
  1616.     ENDFOR
  1617. ENDPROC
  1618.  
  1619. PROC updateobj(obj:PTR TO obj,objn)
  1620.     DEF cel:PTR TO cel
  1621.     DEF i
  1622.     DEF x=60000,y=60000,w=0,h=0
  1623.     IF obj
  1624.         FOR i:=0 TO MAXCELS
  1625.             cel:=cels[i]
  1626.             IF cel
  1627.                 IF cel.obj=objn
  1628.                     IF cel.sets[curset]
  1629.                         orcel(cel,obj,TRUE)
  1630.                     ENDIF
  1631.                 ENDIF
  1632.             ENDIF
  1633.         ENDFOR
  1634.     ENDIF
  1635. ENDPROC
  1636.  
  1637. PROC playsound(co:PTR TO command)
  1638.     IF co.sound
  1639.         DoDTMethodA(co.sound,NIL,NIL,[DTM_TRIGGER,NIL,STM_PLAY,NIL])
  1640.     ENDIF
  1641. ENDPROC
  1642.  
  1643. PROC runcommands(ev:PTR TO event)
  1644.     DEF co:PTR TO command,oldco
  1645.     DEF next2
  1646.     DEF type,cel,cel2
  1647.     DEF newev:PTR TO event
  1648.     DEF co2:PTR TO command
  1649.     DEF obj:PTR TO obj
  1650.  
  1651.     prechange()
  1652.     co:=ev.commands.head
  1653.     REPEAT
  1654.         next2:=co.ln.succ
  1655.         IF (next2)
  1656.             type:=co.type
  1657.             SELECT type
  1658.             CASE CO_SOUND
  1659.                 playsound(co)
  1660.             CASE CO_UNMAP
  1661. ->WriteF('-')
  1662.                 IF co.obj=-1
  1663.                     cel:=findnamedcel(co.cel)
  1664.                     IF cel>-1
  1665.                         unmapcel(cel)
  1666.                     ENDIF
  1667.                 ELSE
  1668.                     unmapobj(co.obj)
  1669.                 ENDIF
  1670.             CASE CO_MAP
  1671. ->WriteF('+')
  1672.                 IF co.obj=-1
  1673.                     cel:=findnamedcel(co.cel)
  1674.                     IF cel>-1
  1675.                         mapcel(cel)
  1676.                     ENDIF
  1677.                 ELSE
  1678.                     mapobj(co.obj)
  1679.                 ENDIF
  1680.             CASE CO_ALTMAP
  1681. ->WriteF('A')
  1682.                 IF co.obj=-1
  1683.                     cel:=findnamedcel(co.cel)
  1684.                     IF cel>-1
  1685.                         altmapcel(cel)
  1686.                     ENDIF
  1687.                 ELSE
  1688.                     altmapobj(co.obj)
  1689.                 ENDIF
  1690.             CASE CO_TIMER
  1691. ->WriteF('T')
  1692.                 newev:=findeventtype(EV_ALARM,co.x)
  1693.                 IF newev
  1694.                     newev.counter:=co.y
  1695.                 ENDIF
  1696.             CASE CO_MOVE
  1697.                 IF co.obj=-1
  1698.                     cel:=findnamedcel(co.cel)
  1699.                     IF cel>-1
  1700. ->                        movecel(cel)
  1701.                     ENDIF
  1702.                 ELSE
  1703.                     obj:=objs[co.obj]
  1704.                     IF ((obj<>0) AND (curobj=0))
  1705.                         dragox:=0;dragoy:=0
  1706.                         obj.forcemove(obj.x[curset]+co.x,obj.y[curset]+co.y,FALSE)
  1707.                     ENDIF
  1708.                 ENDIF
  1709.             ENDSELECT
  1710.         ENDIF
  1711.         co:=next2
  1712.     UNTIL next2=0
  1713.     postchange()
  1714. ENDPROC
  1715.  
  1716. PROC dectimers()
  1717.     DEF ev:PTR TO event
  1718.     DEF next1
  1719.     ev:=eventlist
  1720.     REPEAT
  1721.         next1:=ev.ln.succ
  1722.         IF (next1)
  1723.             IF ev.type=EV_ALARM
  1724.                 IF ev.counter>0
  1725.                     ev.counter:=bigger(ev.counter-animspeed,0)
  1726.                     IF ev.counter=0
  1727.                         runcommands(ev)
  1728.                     ENDIF
  1729.                 ENDIF
  1730.             ENDIF
  1731.         ENDIF
  1732.         ev:=next1
  1733.     UNTIL next1=0
  1734. ENDPROC
  1735.  
  1736. PROC postkiss()
  1737.     closescr()
  1738. ENDPROC
  1739.  
  1740. PROC updatecolors()
  1741.     DEF i,pn=0,t
  1742.     DEF uf:PTR TO LONG
  1743.     DEF cel:PTR TO cel
  1744.     DEF r,g,b,p
  1745.     IF onwb
  1746.         busy()
  1747.         FOR i:=1 TO 255
  1748.             IF apens[i]>=0
  1749.                 ReleasePen(cm,apens[i])
  1750.                 apens[i]:=-1
  1751.             ENDIF
  1752.         ENDFOR
  1753.         IF (bgpen>=0) THEN ReleasePen(cm,bgpen);bgpen:=-1
  1754.         FOR i:=0 TO 15
  1755.             IF (palet[i].color[curpal]<>0)
  1756.                 FOR t:=0 TO (palet[i].color_num-1)
  1757.                     r:=(Long(palet[i].color[curpal]+(t*12)))
  1758.                     g:=(Long(palet[i].color[curpal]+(t*12)+4))
  1759.                     b:=(Long(palet[i].color[curpal]+(t*12)+8))
  1760.                     IF pn>0 
  1761.                         apens[pn]:=ObtainBestPenA(cm,r,g,b,[OBP_PRECISION,PRECISION_EXACT])
  1762.                         IF apens[pn]=0
  1763.                             REPEAT
  1764.                                 IF apens[pn]>=0 THEN ReleasePen(cm,apens[pn])
  1765.                                 r:=r+$01010101
  1766.                                 g:=g+$01010101
  1767.                                 b:=b+$01010101
  1768.                                 apens[pn]:=ObtainBestPenA(cm,r,g,b,[OBP_PRECISION,PRECISION_EXACT,TAG_END])
  1769.                             UNTIL (apens[pn]>0)
  1770.                         ENDIF
  1771.                         IF apens[pn]=-1 THEN apens[pn]:=pn
  1772.                     ELSE
  1773.                         bgpen:=ObtainBestPenA(cm,r,g,b,[OBP_PRECISION,PRECISION_GUI])
  1774.                     ENDIF
  1775.                     pn:=pn+1;IF pn>255 THEN pn:=255
  1776.                 ENDFOR
  1777.             ENDIF
  1778.         ENDFOR
  1779.         FOR i:=0 TO MAXCELS
  1780.             cel:=cels[i]
  1781.             IF cel
  1782.                 cel.recolor()
  1783.             ENDIF
  1784.         ENDFOR
  1785.         ready()
  1786.         updatelist()
  1787.     ELSE
  1788.         uf:=New(4096)
  1789.         FOR i:=0 TO 15
  1790.             IF (palet[i].color[curpal]<>0)
  1791.                 FOR t:=0 TO (palet[i].color_num-1)
  1792.                     uf[pn*3]:=(Long(palet[i].color[curpal]+(t*12)))
  1793.                     uf[pn*3+1]:=(Long(palet[i].color[curpal]+(t*12)+4))
  1794.                     uf[pn*3+2]:=(Long(palet[i].color[curpal]+(t*12)+8))
  1795.                     SetRGB32CM(cm,pn,uf[pn*3],uf[pn*3+1],uf[pn*3+2])
  1796.                     pn:=pn+1;IF pn>255 THEN pn:=255
  1797.                 ENDFOR
  1798.             ENDIF
  1799.         ENDFOR
  1800.         RethinkDisplay()
  1801.         RemakeDisplay()
  1802.         Dispose(uf)
  1803.         updatelist()
  1804.     ENDIF
  1805. ENDPROC
  1806.  
  1807. PROC findcolor(r1,g1,b1)
  1808.     DEF score,pick,news,r,g,b,i,t,pn=0
  1809.     score:=1000000;pick:=0
  1810.     FOR i:=0 TO 15
  1811.         IF (palet[i].color[curpal]<>0)
  1812.             FOR t:=0 TO (palet[i].color_num-1)
  1813.                 r:=(Long(palet[i].color[curpal]+(t*12)))
  1814.                 g:=(Long(palet[i].color[curpal]+(t*12)+4))
  1815.                 b:=(Long(palet[i].color[curpal]+(t*12)+8))
  1816.                 r:=long2byte(r)
  1817.                 g:=long2byte(g)
  1818.                 b:=long2byte(b)
  1819.                 r:=Abs(r-r1)
  1820.                 g:=Abs(g-g1)
  1821.                 b:=Abs(b-b1)
  1822.                 news:=(r*r)+(g*g)+(b*b)
  1823.                 IF (news<score)
  1824.                     pick:=pn
  1825.                     score:=news
  1826.                 ENDIF
  1827. ->WriteF('\nr=\d[3] g=\d[3] b=\d[3] score=\d best=\d',r1,g1,b1,news,score)
  1828.                 pn:=pn+1;IF pn>255 THEN pn:=255
  1829.             ENDFOR
  1830.         ENDIF
  1831.     ENDFOR
  1832. ENDPROC pick
  1833.  
  1834. PROC savecoords(newfh)
  1835.     DEF obj:PTR TO obj
  1836.     DEF cel:PTR TO cel
  1837.     DEF zz,zzz,t,tt,i,ii
  1838.     DEF string[500]:STRING
  1839.     IF newfh
  1840.         FOR i:=0 TO 9
  1841.             StringF(string,'\n$\d[1]',pb[i])
  1842.             Write(newfh,string,StrLen(string))
  1843.             ii:=0
  1844.             FOR t:=0 TO MAXCELS
  1845.                 cel:=cels[t]
  1846.                 IF cel
  1847.                     IF (cel.sets[i])
  1848.                         ii:=bigger(ii,cel.obj)
  1849.                     ENDIF
  1850.                 ENDIF
  1851.             ENDFOR
  1852.             FOR t:=0 TO ii STEP 16
  1853.                 FOR tt:=t TO smaller(t+15,ii)
  1854.                     zz:=-11
  1855.                     FOR zzz:=0 TO MAXCELS
  1856.                         cel:=cels[zzz]
  1857.                         IF cel
  1858.                             IF cel.sets[i]
  1859.                                 IF (cel.obj=tt)
  1860.                                     obj:=objs[cel.obj]
  1861.                                     IF obj
  1862.                                         zz:=zzz
  1863.                                     ENDIF
  1864.                                 ENDIF
  1865.                             ENDIF
  1866.                         ENDIF
  1867.                     ENDFOR
  1868.                     IF zz>=0
  1869.                         StringF(string,' \d,\d',obj.x[i],obj.y[i])
  1870.                         Write(newfh,string,StrLen(string))
  1871.                     ELSE
  1872.                         Write(newfh,' *',2)
  1873.                     ENDIF
  1874.                 ENDFOR
  1875.                 Write(newfh,'\n',1)
  1876.             ENDFOR
  1877.             Write(newfh,'\n',1)
  1878.         ENDFOR
  1879.         Write(newfh,'\n;This .cnf file was saved by PlayFKISS for Amiga Computers.',STRLEN)
  1880.     ENDIF
  1881. ENDPROC
  1882.  
  1883. PROC saveall(cname)
  1884.     DEF dir[500]:STRING
  1885.     DEF file[500]:STRING
  1886.     DEF string[500]:STRING
  1887.     DEF filename[500]:STRING
  1888.     DEF ii=0,i
  1889.     DEF oldfh,newfh
  1890.     DEF bufptr,filebuf,filelen
  1891.     DEF oldout
  1892.     DEF obj:PTR TO obj
  1893.     DEF cel:PTR TO cel
  1894.     DEF event:PTR TO event
  1895.     DEF com:PTR TO command
  1896.     DEF next1,next2
  1897.     DEF select
  1898.  
  1899.     StrCopy(filename,cname,ALL)
  1900.     splitname(filename,dir,file)
  1901.     WbenchToFront()
  1902.     ii:=AslRequest(filereq,[ASL_HAIL,'Save .CNF file as?',
  1903.                 ASL_OKTEXT,'Save',ASL_FILE,file,ASL_DIR,dir,
  1904.                 ASLFR_DOPATTERNS,TRUE,ASLFR_DOSAVEMODE,TRUE,FILF_NEWIDCMP,TRUE,NIL,NIL])
  1905.     IF onwb=0 THEN WbenchToBack()
  1906.     IF ii
  1907.         StrCopy(string,filename,ALL)
  1908.         StrCopy(filename,filereq.drawer,ALL)
  1909.         eaddpart(filename,filereq.file,490)
  1910.         oldfh:=Open(filename,MODE_OLDFILE)
  1911.         newfh:=1
  1912.         IF oldfh
  1913.             Close(oldfh)
  1914.             newfh:=EasyRequestArgs(win,[20,0,'Sorry:','Overwriting existing .cnf files is forbidden!',
  1915.                 'Understood'],0,0)
  1916.             newfh:=0
  1917.         ENDIF
  1918.         IF newfh
  1919.             newfh:=Open(filename,MODE_NEWFILE)
  1920.             IF newfh
  1921.                 busy()
  1922.                 oldout:=SetStdOut(newfh)
  1923.                 WriteF(';\n;This file was written by PlayFKISS for Amiga Computers\n;\n')
  1924.                 FOR i:=0 TO 15
  1925.                     IF StrLen(palet[i].name)
  1926.                         splitname(palet[i].name,dir,file)
  1927.                         WriteF('%\s\n',file)
  1928.                     ENDIF
  1929.                 ENDFOR
  1930.                 WriteF('(\d,\d)  ;Environment dimensions\n',envw,envh)
  1931.                 WriteF('[0  ;Border color\n\n')
  1932.                 FOR i:=MAXCELS TO 0 STEP -1
  1933.                     cel:=cels[i]
  1934.                     IF cel
  1935.                         obj:=objs[cel.obj]
  1936.                         IF obj
  1937.                             WriteF('#\d',cel.obj)
  1938.                             IF obj.fix
  1939.                                 WriteF('.\d ',obj.fix)
  1940.                             ELSE
  1941.                                 WriteF('     ')
  1942.                             ENDIF
  1943.                             WriteF('\s  *\d  :',cel.realname,cel.palet_num)
  1944.                             FOR ii:=0 TO 9
  1945.                                 IF cel.sets[ii]
  1946.                                     WriteF('\d ',ii)
  1947.                                 ELSE
  1948.                                     WriteF('  ')
  1949.                                 ENDIF
  1950.                             ENDFOR
  1951.                             WriteF('  ;\s\n',cel.comment)
  1952.                         ENDIF
  1953.                     ENDIF
  1954.                 ENDFOR
  1955.                 IF (fkissfound)
  1956.                     WriteF(';\n;\n;FKISS stuff follows:\n;\n@EventHandler()\n;\n')
  1957.                     event:=eventlist.head
  1958.                     REPEAT
  1959.                         next1:=event.ln.succ
  1960.                         IF (next1)
  1961.                             select:=event.type
  1962.                             SELECT select
  1963.                             CASE EV_INIT
  1964.                                 WriteF(';@initialize()\n')
  1965.                             CASE EV_BEGIN
  1966.                                 WriteF(';@begin()\n')
  1967.                             CASE EV_END
  1968.                                 WriteF(';@end()\n')
  1969.                             CASE EV_ALARM
  1970.                                 WriteF(';@alarm(\d)\n',event.obj)
  1971.                             CASE EV_CATCH
  1972.                                 IF event.obj>-1
  1973.                                     WriteF(';@catch(#\d)\n',event.obj)
  1974.                                 ELSE
  1975.                                     WriteF(';@catch("\s")\n',event.cel)
  1976.                                 ENDIF
  1977.                             CASE EV_UNFIX
  1978.                                 IF event.obj>-1
  1979.                                     WriteF(';@unfix(#\d)\n',event.obj)
  1980.                                 ELSE
  1981.                                     WriteF(';@unfix("\s")\n',event.cel)
  1982.                                 ENDIF
  1983.                             CASE EV_FIXCATCH
  1984.                                 IF event.obj>-1
  1985.                                     WriteF(';@fixcatch(#\d)\n',event.obj)
  1986.                                 ELSE
  1987.                                     WriteF(';@fixcatch("\s")\n',event.cel)
  1988.                                 ENDIF
  1989.                             CASE EV_SET
  1990.                                 WriteF(';@set(\d)\n',event.obj)
  1991.                             CASE EV_DROP
  1992.                                 IF event.obj>-1
  1993.                                     WriteF(';@drop(#\d)\n',event.obj)
  1994.                                 ELSE
  1995.                                     WriteF(';@drop("\s")\n',event.cel)
  1996.                                 ENDIF
  1997.                             ENDSELECT
  1998.                             com:=event.commands.head
  1999.                             REPEAT
  2000.                                 next2:=com.ln.succ
  2001.                                 IF (next2)
  2002.                                     select:=com.type
  2003.                                     SELECT select
  2004.                                     CASE CO_TIMER
  2005.                                         WriteF(';@  timer(\d,\d)\n',com.x,com.y)
  2006.                                     CASE CO_MAP
  2007.                                         IF com.obj>-1
  2008.                                             WriteF(';@  map(#\d)\n',com.obj)
  2009.                                         ELSE
  2010.                                             WriteF(';@  map("\s")\n',com.cel)
  2011.                                         ENDIF
  2012.                                     CASE CO_UNMAP
  2013.                                         IF com.obj>-1
  2014.                                             WriteF(';@  unmap(#\d)\n',com.obj)
  2015.                                         ELSE
  2016.                                             WriteF(';@  unmap("\s")\n',com.cel)
  2017.                                         ENDIF
  2018.                                     CASE CO_SOUND
  2019.                                         WriteF(';@  sound("\s")\n',com.sound)
  2020.                                     CASE CO_MOVE
  2021.                                         IF com.obj>-1
  2022.                                             WriteF(';@  move(#\d,\d,\d)\n',com.obj,com.x,com.y)
  2023.                                         ELSE
  2024.                                             WriteF(';@  move("\s",\d,\d)\n',com.cel,com.x,com.y)
  2025.                                         ENDIF
  2026.                                     CASE CO_ALTMAP
  2027.                                         IF com.obj>-1
  2028.                                             WriteF(';@  altmap(#\d)\n',com.obj)
  2029.                                         ELSE
  2030.                                             WriteF(';@  altmap("\s")\n',com.cel)
  2031.                                         ENDIF
  2032.                                     ENDSELECT
  2033.                                 ENDIF
  2034.                                 com:=next2
  2035.                             UNTIL next2=0
  2036.                         ENDIF
  2037.                         event:=next1
  2038.                         WriteF(';\n')
  2039.                     UNTIL next1=0
  2040.                 ENDIF
  2041.                 WriteF('\n;\n;coordinates follow:\n;\n')
  2042.                 SetStdOut(oldout)
  2043.                 savecoords(newfh)
  2044.                 Close(newfh)
  2045.                 ready()
  2046.             ENDIF
  2047.         ENDIF
  2048.     ENDIF
  2049. ENDPROC
  2050.  
  2051. PROC appendcoords(cname)
  2052.     DEF dir[500]:STRING
  2053.     DEF file[500]:STRING
  2054.     DEF string[500]:STRING
  2055.     DEF filename[500]:STRING
  2056.     DEF ii=0
  2057.     DEF oldfh,newfh
  2058.     DEF bufptr,filebuf,filelen
  2059.     StrCopy(filename,cname,ALL)
  2060.     splitname(filename,dir,file)
  2061.     WbenchToFront()
  2062.     ii:=AslRequest(filereq,[ASL_HAIL,'Append to which .CNF file?',
  2063.                 ASL_OKTEXT,'Save',ASL_FILE,file,ASL_DIR,dir,
  2064.                 ASLFR_DOPATTERNS,TRUE,ASLFR_DOSAVEMODE,TRUE,FILF_NEWIDCMP,TRUE,NIL,NIL])
  2065.     IF onwb=0 THEN WbenchToBack()
  2066.     IF ii
  2067.         StrCopy(string,filename,ALL)
  2068.         StrCopy(filename,filereq.drawer,ALL)
  2069.         eaddpart(filename,filereq.file,490)
  2070.         oldfh:=Open(filename,MODE_OLDFILE)
  2071.         newfh:=1
  2072.         IF oldfh
  2073.             Close(oldfh)
  2074.             newfh:=EasyRequestArgs(win,[20,0,'Confirm overwrite!',
  2075.                 'File exists.\nDo you wish to overwrite?',
  2076.                 'Overwrite|Cancel'],0,0)
  2077.         ENDIF
  2078.         IF newfh
  2079.             busy()
  2080.             filelen:=FileLength(string)
  2081.             IF (filelen>0)
  2082.                 filebuf:=New(filelen)
  2083.                 oldfh:=Open(string,MODE_OLDFILE)
  2084.                 IF oldfh
  2085.                     Read(oldfh,filebuf,filelen)
  2086.                     Close(oldfh)
  2087.                     bufptr:=filebuf
  2088.                     WHILE ((((Char(bufptr)<>10) OR (Char(bufptr)<>13)) AND (Char(bufptr+1)<>"$")) AND (bufptr<=(filebuf+filelen)))
  2089.                         bufptr:=bufptr+1
  2090.                     ENDWHILE
  2091.                     newfh:=Open(filename,MODE_NEWFILE)
  2092.                     IF newfh
  2093.                         Write(newfh,filebuf,(bufptr-filebuf+1))
  2094.                         savecoords(newfh)
  2095.                         Close(newfh)
  2096.                     ENDIF
  2097.                 ENDIF
  2098.                 Dispose(filebuf)
  2099.             ENDIF
  2100.             ready()
  2101.         ENDIF
  2102.     ENDIF
  2103. ENDPROC
  2104.  
  2105. PROC savescreen(cname)
  2106.     DEF dir[500]:STRING
  2107.     DEF file[500]:STRING
  2108.     DEF string[500]:STRING
  2109.     DEF filename[500]:STRING
  2110.     DEF ii=0
  2111.     DEF bufptr,filebuf,filelen
  2112.     DEF imbuf:PTR TO imbuf
  2113.  
  2114.     StrCopy(filename,cname,ALL)
  2115.     splitname(filename,dir,file)
  2116.     StrAdd(file,'.IFF')
  2117.     WbenchToFront()
  2118.     ii:=AslRequest(filereq,[ASL_HAIL,'Save Screen as',
  2119.                 ASL_OKTEXT,'Save',ASL_FILE,file,ASL_DIR,dir,
  2120.                 ASLFR_DOPATTERNS,TRUE,ASLFR_DOSAVEMODE,TRUE,FILF_NEWIDCMP,TRUE,NIL,NIL])
  2121.     IF onwb=0 THEN WbenchToBack()
  2122.     IF ii
  2123.         busy()
  2124.         StrCopy(string,filename,ALL)
  2125.         StrCopy(filename,filereq.drawer,ALL)
  2126.         eaddpart(filename,filereq.file,490)
  2127.         NEW imbuf.new(envw,envh,depth)
  2128.         IF imbuf.bmap
  2129.             ClipBlit(rp,0,0,imbuf.rast,0,0,envw,envh,192)
  2130.             saveclip(filename,imbuf.bmap,vp,envw,envh,0)
  2131.             END imbuf
  2132.         ENDIF
  2133.         ready()
  2134.     ENDIF
  2135. ENDPROC
  2136.  
  2137.  
  2138. PROC saveclip(unitnumber,mom:PTR TO bitmap,vp:PTR TO viewport,width,height,yoffset) HANDLE
  2139.     DEF    ierror,rlen
  2140.     DEF    table=0
  2141.     DEF bmhd=NIL:PTR TO bitmapheader
  2142.     DEF planedata[10]:LIST,cm
  2143.     DEF iff=0:PTR TO iffhandle
  2144.     DEF dang,dumb
  2145.  
  2146.     cm:=vp.colormap
  2147.     bmhd:=New(SIZEOF bitmapheader)
  2148.     rlen:=(((width+15)/16))*2
  2149.     bmhd.width:=width
  2150.     bmhd.height:=height
  2151.     bmhd.left:=0
  2152.     bmhd.top:=0
  2153.     bmhd.depth:=mom.depth
  2154.     bmhd.masking:=0
  2155.     bmhd.compression:=1
  2156.     bmhd.transparent:=0
  2157.     bmhd.xaspect:=1            -> change these later?
  2158.     bmhd.yaspect:=1
  2159.     bmhd.pagewidth:=0
  2160.     bmhd.pageheight:=0
  2161.  
  2162.     iff:=AllocIFF()
  2163.     IF unitnumber<255
  2164.         iff.stream:=OpenClipboard(unitnumber)
  2165.         IF (iff.stream)
  2166.             InitIFFasClip(iff)
  2167.         ELSE            
  2168.             Raise("NOOP")
  2169.         ENDIF
  2170.     ELSE
  2171.         iff.stream:=Open(unitnumber,MODE_NEWFILE)
  2172.         IF (iff.stream)
  2173.             InitIFFasDOS(iff)
  2174.         ELSE
  2175.             Raise("NOOP")
  2176.         ENDIF
  2177.     ENDIF
  2178.     IF (ierror:=OpenIFF(iff,IFFF_WRITE)) THEN Raise("NOOP")
  2179.     PushChunk(iff,"ILBM","FORM",IFFSIZE_UNKNOWN)
  2180.     PushChunk(iff,"ILBM","ANNO",IFFSIZE_UNKNOWN)
  2181.     WriteChunkBytes(iff,'Written by PlayFKiss 2.04',STRLEN)    
  2182.     PopChunk(iff)
  2183.     PushChunk(iff,"ILBM","BMHD",SIZEOF bitmapheader)
  2184.     WriteChunkBytes(iff,bmhd,SIZEOF bitmapheader)    
  2185.     PopChunk(iff)
  2186.     PushChunk(iff,"ILBM","CAMG",4)
  2187.     WriteChunkBytes(iff,[modeid]:LONG,4)    
  2188.     PopChunk(iff)
  2189.     PushChunk(iff,"ILBM","CMAP",IFFSIZE_UNKNOWN)
  2190.     table:=New(50)
  2191.     FOR dang:=0 TO (Shl(1,bmhd.depth)-1)
  2192.         GetRGB32(cm,dang,3,table)
  2193.         WriteChunkBytes(iff,(table),1)
  2194.         WriteChunkBytes(iff,(table+4),1)
  2195.         WriteChunkBytes(iff,(table+8),1)
  2196.     ENDFOR
  2197.     PopChunk(iff)
  2198.     IF (bmhd.depth)
  2199.         FOR dumb:=1 TO 8
  2200.             planedata[dumb]:=Long(mom+4+(4*dumb))+(rlen*yoffset)
  2201.         ENDFOR
  2202.         PushChunk(iff,"ILBM","BODY",IFFSIZE_UNKNOWN)
  2203.         FOR dang:=0 TO height-1
  2204.             FOR dumb:=1 TO bmhd.depth
  2205.                 PutChar(table,rlen-1)                    -> Place number of bytes per row.  SIMPLE COMPRESSION
  2206.                 WriteChunkBytes(iff,table,1)
  2207.                 WriteChunkBytes(iff,planedata[dumb]+(dang*mom.bytesperrow),rlen)
  2208.             ENDFOR
  2209.         ENDFOR
  2210.         PopChunk(iff)
  2211.     ENDIF
  2212.     PopChunk(iff)
  2213.     Raise("NONE")
  2214. EXCEPT
  2215.     freeiff(iff,unitnumber)
  2216.     IF table THEN Dispose(table)
  2217.     IF bmhd THEN Dispose(bmhd)
  2218.     IF (exception<>"NONE") THEN RETURN -1
  2219. ENDPROC 0
  2220.  
  2221. PROC freeiff(iff:PTR TO iffhandle,unit)
  2222.     IF iff
  2223.         CloseIFF(iff)
  2224.         IF (iff.stream)
  2225.             IF unit<100;CloseClipboard(iff.stream);ELSE;Close(iff.stream);ENDIF
  2226.         ENDIF
  2227.         FreeIFF(iff)
  2228.     ENDIF    
  2229. ENDPROC
  2230.  
  2231.  
  2232. PROC recalchvisible() IS win.width-win.borderleft-win.borderright
  2233. PROC recalcvvisible() IS win.height-win.bordertop-win.borderbottom
  2234.  
  2235. PROC updateprop(gadget:PTR TO object,attr,value)
  2236.   SetGadgetAttrsA(gadget,win,NIL,[attr,value,NIL])
  2237. ENDPROC
  2238.  
  2239. PROC updatescroll()
  2240.     DEF w,h
  2241.   w:=recalchvisible()
  2242.   h:=recalcvvisible()
  2243.   updateprop(horizgadget,PGA_VISIBLE,w)
  2244.   updateprop(vertgadget,PGA_VISIBLE,h)
  2245.   GetAttr(PGA_TOP,horizgadget,{offx})
  2246.   GetAttr(PGA_TOP,vertgadget,{offy})
  2247.   updatelistbuffered(offx,offy,w,h)
  2248. ENDPROC
  2249.  
  2250. PROC openscr()
  2251.     DEF wbscr:PTR TO screen,addon=0
  2252.     DEF pens:PTR TO INT
  2253.   DEF resolution,topborder,sf:PTR TO textattr,w,h,bw,bh,rw,rh,gw,gh,gap
  2254.  
  2255.     pens:=New(100)
  2256.     wbscr:=LockPubScreen('Workbench')
  2257.     IF wbscr 
  2258.         addon:=wbscr.barheight+1
  2259.         UnlockPubScreen(0,wbscr)
  2260.     ENDIF
  2261.     pens[DETAILPEN]:=findcolor(255,255,255)
  2262.     pens[BLOCKPEN]:=findcolor(0,0,0)
  2263.     pens[TEXTPEN]:=findcolor(0,0,0)
  2264.     IF pens[TEXTPEN]=0 THEN pens[TEXTPEN]:=findcolor(255,255,255)
  2265.     pens[SHINEPEN]:=findcolor(255,255,255)
  2266.     pens[SHADOWPEN]:=findcolor(0,0,0)
  2267.     pens[FILLPEN]:=findcolor(0,128,255)
  2268.     pens[FILLTEXTPEN]:=findcolor(255,255,255)
  2269.     pens[BACKGROUNDPEN]:=0
  2270.     pens[HIGHLIGHTTEXTPEN]:=findcolor(196,128,32)
  2271.     pens[BARDETAILPEN]:=findcolor(0,0,0)
  2272.     pens[BARBLOCKPEN]:=findcolor(255,255,255)
  2273.     pens[BARTRIMPEN]:=findcolor(0,0,0)
  2274.  
  2275.     IF usewb
  2276.         onwb:=TRUE
  2277.         scr:=LockPubScreen('Workbench')
  2278.         depth:=scr.rastport.bitmap.depth
  2279.     dri:=GetScreenDrawInfo(scr)
  2280.     IF dri
  2281.       sizeimage:=newimageobject(SIZEIMAGE)
  2282.             leftimage:=newimageobject(LEFTIMAGE)
  2283.       rightimage:=newimageobject(RIGHTIMAGE)
  2284.       upimage:=newimageobject(UPIMAGE)
  2285.       downimage:=newimageobject(DOWNIMAGE)
  2286.     ELSE
  2287.         Raise("SCR")
  2288.     ENDIF
  2289.     ELSE
  2290.         onwb:=FALSE
  2291.         depth:=retdepth(mode)
  2292.         scr:=OpenScreenTagList(NIL,[SA_LIKEWORKBENCH,TRUE,
  2293.             SA_DEPTH,depth,
  2294.             SA_TITLE,'PlayFKiSS 2.04',
  2295.             SA_COLORMAPENTRIES,256,
  2296.             SA_FULLPALETTE,TRUE,
  2297.             SA_WIDTH,envw,
  2298.             SA_HEIGHT,envh+addon,
  2299.             SA_INTERLEAVED,TRUE,
  2300.             SA_AUTOSCROLL,screenas,
  2301.             SA_OVERSCAN,screenos,
  2302.             SA_PENS,pens,
  2303.             IF (modeid>0) THEN SA_DISPLAYID ELSE $80000000,
  2304.                 modeid,
  2305.             NIL,NIL])
  2306.         IF scr=0 THEN Raise("SCR")
  2307.     ENDIF
  2308.  
  2309.     IF (vis:=GetVisualInfoA(scr,NIL))=0 THEN Raise("VIS")
  2310.   IF (menu:=CreateMenusA([NM_TITLE,0,'Project','-',0,0,0,
  2311.                                                     NM_ITEM,0,'Edit Window','W',0,0,MENU_OBJWIN,
  2312.                                                     NM_ITEM,0,'Prefs...','P',0,0,MENU_PREFS,
  2313.                                                     NM_ITEM,0,NM_BARLABEL,0,0,0,0,
  2314.                                                     NM_ITEM,0,'Append Coordinates...','A',0,0,MENU_SAVE,
  2315.                                                     NM_ITEM,0,'Save All...','S',0,0,MENU_SAVEALL,
  2316.                                                     NM_ITEM,0,'Close','C',0,0,MENU_CLOSE,
  2317.                                                     NM_ITEM,0,NM_BARLABEL,0,0,0,0,
  2318.                                                     NM_ITEM,0,'Redraw Screen','R',0,0,MENU_REDRAW,
  2319.                                                     NM_ITEM,0,'Save Screen...','E',0,0,MENU_SAVESCREEN,
  2320.                                                     NM_ITEM,0,NM_BARLABEL,0,0,0,0,
  2321.                                                     NM_ITEM,0,'About','?',0,0,MENU_ABOUT,
  2322.                                                     NM_ITEM,0,NM_BARLABEL,0,0,0,0,
  2323.                                                     NM_ITEM,0,'Quit','Q',0,0,MENU_QUIT,
  2324.                                                     NM_TITLE,0,'Edit',0,0,0,0,
  2325.                                                     NM_ITEM,0,'Undo','Z',0,0,MENU_UNDO,
  2326.                                                     NM_ITEM,0,'Reset','T',0,0,MENU_RESETOBJ,
  2327.                                                     NM_ITEM,0,NM_BARLABEL,0,0,0,0,
  2328.                                                     NM_ITEM,0,'Unfix','U',0,0,MENU_UNFIXOBJ,
  2329.                                                     NM_ITEM,0,'Refix','I',0,0,MENU_REFIXOBJ,
  2330.                                                     NM_ITEM,0,NM_BARLABEL,0,0,0,0,
  2331.                                                     NM_ITEM,0,'Move Cel Forward','+',NM_COMMANDSTRING,0,MENU_MOVEFORWARD,
  2332.                                                     NM_ITEM,0,'Move Cel Back','-',NM_COMMANDSTRING,0,MENU_MOVEBACK,
  2333.                                                     NM_ITEM,0,NM_BARLABEL,0,0,0,0,
  2334.                                                     NM_ITEM,0,'Reveal Cel...','.',0,0,MENU_REVEAL,
  2335.                                                     NM_ITEM,0,'Patrol Bounds',0,0,0,MENU_PATROL,
  2336.                                                     NM_ITEM,0,NM_BARLABEL,0,0,0,0,
  2337.                                                     NM_ITEM,0,'RESET',0,0,0,MENU_RESETSET,
  2338.                                                     NM_TITLE,0,'Item',0,0,0,0,
  2339.                                                     NM_ITEM,0,'Set',0,0                ,0,0,
  2340.                                                     NM_SUB,0,'Set #0      ','F1',NM_COMMANDSTRING OR CHECKIT,%1111111110,MENU_SET0,
  2341.                                                     NM_SUB,0,'Set #1','F2',NM_COMMANDSTRING OR CHECKIT,%1111111101,MENU_SET1,
  2342.                                                     NM_SUB,0,'Set #2','F3',NM_COMMANDSTRING OR CHECKIT,%1111111011,MENU_SET2,
  2343.                                                     NM_SUB,0,'Set #3','F4',NM_COMMANDSTRING OR CHECKIT,%1111110111,MENU_SET3,
  2344.                                                     NM_SUB,0,'Set #4','F5',NM_COMMANDSTRING OR CHECKIT,%1111101111,MENU_SET4,
  2345.                                                     NM_SUB,0,'Set #5','F6',NM_COMMANDSTRING OR CHECKIT,%1111011111,MENU_SET5,
  2346.                                                     NM_SUB,0,'Set #6','F7',NM_COMMANDSTRING OR CHECKIT,%1110111111,MENU_SET6,
  2347.                                                     NM_SUB,0,'Set #7','F8',NM_COMMANDSTRING OR CHECKIT,%1101111111,MENU_SET7,
  2348.                                                     NM_SUB,0,'Set #8','F9',NM_COMMANDSTRING OR CHECKIT,%1011111111,MENU_SET8,
  2349.                                                     NM_SUB,0,'Set #9','F10',NM_COMMANDSTRING OR CHECKIT,%0111111111,MENU_SET9,
  2350.                                                     NM_ITEM,0,'Color',0,0                ,0,0,
  2351.                                                     NM_SUB,0,'Set #0      ','1',NM_COMMANDSTRING OR CHECKIT,%1111111110,MENU_CSET0,
  2352.                                                     NM_SUB,0,'Set #1','2',NM_COMMANDSTRING OR CHECKIT,%1111111101,MENU_CSET1,
  2353.                                                     NM_SUB,0,'Set #2','3',NM_COMMANDSTRING OR CHECKIT,%1111111011,MENU_CSET2,
  2354.                                                     NM_SUB,0,'Set #3','4',NM_COMMANDSTRING OR CHECKIT,%1111110111,MENU_CSET3,
  2355.                                                     NM_SUB,0,'Set #4','5',NM_COMMANDSTRING OR CHECKIT,%1111101111,MENU_CSET4,
  2356.                                                     NM_SUB,0,'Set #5','6',NM_COMMANDSTRING OR CHECKIT,%1111011111,MENU_CSET5,
  2357.                                                     NM_SUB,0,'Set #6','7',NM_COMMANDSTRING OR CHECKIT,%1110111111,MENU_CSET6,
  2358.                                                     NM_SUB,0,'Set #7','8',NM_COMMANDSTRING OR CHECKIT,%1101111111,MENU_CSET7,
  2359.                                                     NM_SUB,0,'Set #8','9',NM_COMMANDSTRING OR CHECKIT,%1011111111,MENU_CSET8,
  2360.                                                     NM_SUB,0,'Set #9','10',NM_COMMANDSTRING OR CHECKIT,%0111111111,MENU_CSET9,
  2361.                                                     NM_END,0,'End','x',0,0,0]:newmenu,NIL))=NIL THEN Raise("MENU")
  2362.     LayoutMenusA(menu,vis,[GTMN_NEWLOOKMENUS,TRUE,NIL,NIL])
  2363.     IF (onwb)
  2364.         IF sizeimage=0 THEN Raise("SCR")
  2365.       resolution:=sysisize()
  2366.       sf:=scr.font
  2367.       topborder:=scr.wbortop+sf.ysize+1
  2368.       w:=sizeimage.width
  2369.       h:=sizeimage.height
  2370.       bw:=IF resolution=SYSISIZE_LOWRES THEN 1 ELSE 2
  2371.       bh:=IF resolution=SYSISIZE_HIRES THEN 2 ELSE 1
  2372.       rw:=IF resolution=SYSISIZE_HIRES THEN 3 ELSE 2
  2373.       rh:=IF resolution=SYSISIZE_HIRES THEN 2 ELSE 1
  2374.       gh:=bigger(leftimage.height,h)
  2375.       gh:=bigger(rightimage.height,gh)
  2376.       gw:=bigger(upimage.width,w)
  2377.       gw:=bigger(downimage.width,gw)
  2378.       gap:=1
  2379.       horizgadget:=newpropobject(FREEHORIZ,
  2380.         [GA_LEFT,rw+gap,
  2381.          GA_RELBOTTOM,bh-gh+2,
  2382.          GA_RELWIDTH,(-gw)-gap-leftimage.width-rightimage.width-rw-rw,
  2383.          GA_HEIGHT,gh-bh-bh-2,
  2384.          GA_BOTTOMBORDER,TRUE,
  2385.          GA_ID,HORIZ_GID,
  2386.          PGA_TOTAL,envw,
  2387.          PGA_VISIBLE,envw,
  2388.          GA_GZZGADGET,TRUE,
  2389.          NIL])
  2390.       vertgadget:=newpropobject(FREEVERT,
  2391.         [GA_RELRIGHT,bw-gw+3,
  2392.          GA_TOP,topborder+rh,
  2393.          GA_WIDTH,gw-bw-bw-4,
  2394.          GA_RELHEIGHT,(-topborder)-h-upimage.height-downimage.height-rh-rh,
  2395.          GA_RIGHTBORDER,TRUE,
  2396.          GA_PREVIOUS,horizgadget,
  2397.          GA_ID,VERT_GID,
  2398.          PGA_TOTAL,envh,
  2399.          PGA_VISIBLE,envh,
  2400.          GA_GZZGADGET,TRUE,
  2401.          NIL])
  2402.       leftgadget:=newbuttonobject(leftimage,
  2403.         [GA_RELRIGHT,(1)-leftimage.width-rightimage.width-gw,
  2404.          GA_RELBOTTOM,(1)-leftimage.height,
  2405.          GA_BOTTOMBORDER,TRUE,
  2406.          GA_PREVIOUS,vertgadget,
  2407.          GA_ID,LEFT_GID,
  2408.          GA_GZZGADGET,TRUE,
  2409.          NIL])
  2410.       rightgadget:=newbuttonobject(rightimage,
  2411.         [GA_RELRIGHT,(1)-rightimage.width-gw,
  2412.          GA_RELBOTTOM,(1)-rightimage.height,
  2413.          GA_BOTTOMBORDER,TRUE,
  2414.          GA_PREVIOUS,leftgadget,
  2415.          GA_ID,RIGHT_GID,
  2416.          GA_GZZGADGET,TRUE,
  2417.          NIL])
  2418.       upgadget:=newbuttonobject(upimage,
  2419.         [GA_RELRIGHT,(1)-upimage.width,
  2420.          GA_RELBOTTOM,(1)-upimage.height-downimage.height-h,
  2421.          GA_RIGHTBORDER,TRUE,
  2422.          GA_PREVIOUS,rightgadget,
  2423.          GA_ID,UP_GID,
  2424.          GA_GZZGADGET,TRUE,
  2425.          NIL])
  2426.       downgadget:=newbuttonobject(downimage,
  2427.         [GA_RELRIGHT,(1)-downimage.width,
  2428.          GA_RELBOTTOM,(1)-downimage.height-h,
  2429.          GA_RIGHTBORDER,TRUE,
  2430.          GA_PREVIOUS,upgadget,
  2431.          GA_ID,DOWN_GID,
  2432.          GA_GZZGADGET,TRUE,
  2433.          NIL])
  2434.       IF downgadget=0 THEN Raise("WIN")
  2435.         win:=OpenWindowTagList(0,[WA_INNERWIDTH,envw,WA_INNERHEIGHT,envh,
  2436.             WA_GADGETS,horizgadget,
  2437.             WA_TOP,scr.barheight+1,WA_LEFT,0,
  2438.             WA_FLAGS,WFLG_ACTIVATE OR WFLG_SMART_REFRESH  OR WFLG_GIMMEZEROZERO
  2439.                     OR WFLG_DRAGBAR OR WFLG_DEPTHGADGET OR  WFLG_SIZEGADGET OR WFLG_CLOSEGADGET,
  2440.             WA_SIZEBRIGHT,TRUE,
  2441.             WA_SIZEBBOTTOM,TRUE,
  2442.             WA_AUTOADJUST,TRUE,
  2443.             WA_BORDERLESS,FALSE,
  2444.             WA_BACKDROP,FALSE,
  2445.             WA_CUSTOMSCREEN,scr,
  2446.             WA_NEWLOOKMENUS,TRUE,
  2447.             WA_POINTER,hand1,
  2448.             WA_IDCMP,IDCMP_MENUPICK OR IDCMP_MOUSEBUTTONS OR IDCMP_INTUITICKS OR IDCMP_MENUVERIFY OR IDCMP_MOUSEMOVE OR IDCMP_VANILLAKEY OR IDCMP_RAWKEY OR IDCMP_NEWSIZE OR IDCMP_CLOSEWINDOW OR IDCMP_REFRESHWINDOW OR IDCMP_IDCMPUPDATE,
  2449.             WA_MINWIDTH,96,
  2450.             WA_MINHEIGHT,64,
  2451.             WA_TITLE,'PlayFKiss 2.04',
  2452.             WA_SCREENTITLE,'PlayFKiss 2.04',
  2453.             NIL,NIL])
  2454.     ELSE
  2455.         win:=OpenWindowTagList(0,[WA_WIDTH,scr.width,WA_HEIGHT,scr.height-scr.barheight-1,
  2456.             WA_TOP,scr.barheight+1,WA_LEFT,0,
  2457.             WA_FLAGS,WFLG_ACTIVATE OR WFLG_SMART_REFRESH,
  2458.             WA_BORDERLESS,TRUE,
  2459.             WA_BACKDROP,TRUE,
  2460.             WA_CUSTOMSCREEN,scr,
  2461.             WA_NEWLOOKMENUS,TRUE,
  2462.             WA_POINTER,hand1,
  2463.             WA_IDCMP,IDCMP_MENUPICK OR IDCMP_MOUSEBUTTONS OR IDCMP_INTUITICKS OR IDCMP_MENUVERIFY OR IDCMP_MOUSEMOVE OR IDCMP_VANILLAKEY OR IDCMP_RAWKEY,
  2464.             NIL,NIL])
  2465.     ENDIF
  2466.     IF win=0 THEN Raise("WIN")
  2467.   w:=recalchvisible()
  2468.   h:=recalcvvisible()
  2469.   updateprop(horizgadget,PGA_VISIBLE,w)
  2470.   updateprop(vertgadget,PGA_VISIBLE,h)
  2471.   GetAttr(PGA_TOP,horizgadget,{offx})
  2472.   GetAttr(PGA_TOP,vertgadget,{offy})
  2473.  
  2474.     SetMouseQueue(win,1)
  2475.     SetMenuStrip(win,menu)
  2476.     vp:=scr.viewport
  2477.     cm:=vp.colormap
  2478.     rp:=win.rport
  2479.     IF onwb=FALSE
  2480.         IF (retdepth(mode)<5)
  2481.             SetRGB32(vp,17,byte2long(160),byte2long(160),byte2long(160))
  2482.             SetRGB32(vp,18,0,0,0)
  2483.             SetRGB32(vp,19,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF)
  2484.         ENDIF
  2485.     ENDIF
  2486.     usecgfx:=FALSE
  2487.     IF (cybergfxbase<>0)
  2488.         IF (IsCyberModeID(modeid)<>0) THEN usecgfx:=TRUE
  2489.     ENDIF
  2490.     gbuf:=New((envw*envh)+(envw*10))
  2491.     Dispose(pens)
  2492. ENDPROC
  2493.  
  2494. PROC closescr()
  2495.     DEF i
  2496.     IF win
  2497.         CloseWindow(win)
  2498.         IF (horizgadget) THEN DisposeObject(horizgadget);horizgadget:=0
  2499.         IF (vertgadget) THEN DisposeObject(vertgadget);vertgadget:=0
  2500.         IF (leftgadget) THEN DisposeObject(leftgadget);leftgadget:=0
  2501.         IF (rightgadget) THEN DisposeObject(rightgadget);rightgadget:=0
  2502.         IF (upgadget) THEN DisposeObject(upgadget);upgadget:=0
  2503.         IF (downgadget) THEN DisposeObject(downgadget);downgadget:=0
  2504.         win:=0
  2505.     ENDIF
  2506.     IF vis
  2507.         FreeVisualInfo(vis)
  2508.         vis:=0
  2509.     ENDIF
  2510.     FOR i:=1 TO 255
  2511.         IF apens[i]>=0 THEN ReleasePen(cm,apens[i])
  2512.         apens[i]:=-1
  2513.     ENDFOR
  2514.     IF (bgpen>=0) THEN ReleasePen(cm,bgpen);bgpen:=-1
  2515.     IF scr
  2516.         IF dri THEN FreeScreenDrawInfo(scr,dri);dri:=0
  2517.         IF onwb
  2518.             IF sizeimage THEN DisposeObject(sizeimage);sizeimage:=0
  2519.             IF leftimage THEN DisposeObject(leftimage);leftimage:=0
  2520.             IF rightimage THEN DisposeObject(rightimage);rightimage:=0
  2521.             IF upimage THEN DisposeObject(upimage);upimage:=0
  2522.             IF downimage THEN DisposeObject(downimage);downimage:=0
  2523.             UnlockPubScreen(0,scr)
  2524.         ELSE
  2525.             CloseScreen(scr)
  2526.         ENDIF
  2527.         scr:=0
  2528.         cm:=0
  2529.     ENDIF
  2530.     IF gbuf THEN Dispose(gbuf);gbuf:=0
  2531.     WbenchToFront()
  2532. ENDPROC
  2533.  
  2534. PROC freeevents()
  2535.     DEF event:PTR TO event
  2536.     DEF com:PTR TO command
  2537.     DEF next1,next2
  2538.     event:=eventlist.head
  2539.     REPEAT
  2540.         next1:=event.ln.succ
  2541.         IF (next1)
  2542.             com:=event.commands.head
  2543.             REPEAT
  2544.                 next2:=com.ln.succ
  2545.                 IF (next2)
  2546.                     Remove(com)
  2547.                     IF com.cel THEN DisposeLink(com.cel)
  2548.                     IF com.sound THEN DisposeDTObject(com.sound)
  2549.                     END com
  2550.                 ENDIF
  2551.                 com:=next2
  2552.             UNTIL next2=0
  2553.             Remove(event)
  2554.             IF event.cel THEN DisposeLink(event.cel)
  2555.             END event
  2556.         ENDIF
  2557.         event:=next1
  2558.     UNTIL next1=0
  2559. ENDPROC
  2560.  
  2561. PROC freepals()
  2562.     DEF i
  2563.     FOR i:=0 TO 15
  2564.         StrCopy(palet[i].name,'')
  2565.     ENDFOR
  2566. ENDPROC
  2567.  
  2568. ver:
  2569.  CHAR 0,0,0,'$VER: playfkiss 2.04 (10.2.96)',10,0,0
  2570.  
  2571. PROC loadcnf() HANDLE
  2572.     DEF fh=0
  2573.     DEF fib=0:PTR TO fileinfoblock
  2574.     DEF lock=0
  2575.     DEF buf=0:PTR TO CHAR
  2576.     DEF dir[500]:STRING,fi[500]:STRING
  2577.     DEF lha[50]:STRING
  2578.     DEF rr=0,res=0
  2579.     DEF wscr=0:PTR TO screen
  2580.     DEF fileloaded=0
  2581.     DEF isarc=FALSE
  2582.  
  2583.     wscr:=LockPubScreen('Workbench')
  2584.     IF wscr
  2585.         NEW ezclist.new()
  2586.         NEW errlist.new()
  2587.         errlist.add('   Errors:')
  2588.  
  2589.         IF StrLen(ofilename) THEN StrCopy(afname,ofilename)
  2590.         NEW pppp.new('PlayFKiss')
  2591.         gh:=guiinit('PlayFKiss 2.04',
  2592.             [ROWS,
  2593.                 [PLUGIN,0,pppp],
  2594.                 [COLS,
  2595.                     [ROWS,
  2596.                         [COLS,
  2597.                             ghafnamegad:=[STR,{loadstr},'Kiss Set',afname,50,1],
  2598.                             ghgetgad:=[BUTTON,{getfile},'Choose...']
  2599.                         ],
  2600.                         cellistv:=[LISTV,0,0,32,6,ezclist.head(),TRUE,0,0]
  2601.                     ]
  2602.                 ],
  2603.                 [BEVELR,
  2604.                     [COLS,
  2605.                         [EQROWS,
  2606.                             nobjgad:=[NUM,MAXOBJS,'Objs:',0,0],
  2607.                             ncelgad:=[NUM,MAXCELS,'Cels:',0,0]
  2608.                         ],
  2609.                         [EQROWS,
  2610.                             evgad:=[NUM,64738,'Events:',0,0],
  2611.                             cogad:=[NUM,64738,'Actions:',0,0]
  2612.                         ],
  2613.                         [EQROWS,
  2614.                             colgad:=[NUM,256,'Colors:',0,0],
  2615.                             memgad:=[NUM,20000000,'Memory:',0,0]                
  2616.                         ]
  2617.                     ]
  2618.                 ],
  2619.                 [COLS,
  2620.                     errlistv:=[LISTV,0,0,8,2,errlist.head(),TRUE,0,0]
  2621.                 ],
  2622.                 [BAR],
  2623.                 [EQCOLS,
  2624.                     ppgad:=[SBUTTON,1,'Play'],
  2625.                     [SBUTTON,{prefs},'Prefs'],
  2626.                     [SBUTTON,{aboutme},'About'],
  2627.                     qqgad:=[SBUTTON,2,'Quit']
  2628.                 ]
  2629.             ]
  2630.         ,0,wscr)
  2631.         sizewin(gh.wnd,GH_MAIN)
  2632.         pppp.setlevel(0,10)
  2633.         pppp.text('Select .cnf file...')
  2634.         cellistgad:=findgadget(gh,cellistv)
  2635.         errlistgad:=findgadget(gh,errlistv)
  2636.         playgad:=findgadget(gh,ppgad)
  2637.         quitgad:=findgadget(gh,qqgad)
  2638.         getgad:=findgadget(gh,ghgetgad)
  2639.         afnamegad:=findgadget(gh,ghafnamegad)
  2640.         IF (fib:=AllocDosObject(DOS_FIB,0))=0 THEN Raise("err")
  2641.  
  2642.         continue:=0
  2643.         rr:=0
  2644.         res:=0
  2645.  
  2646.         fileloaded:=0
  2647.         REPEAT
  2648.             IF StrLen(afname)
  2649.                 splitname(afname,dir,fi)
  2650.                 RightStr(lha,fi,4)
  2651.                 IF stricmp('.lha',lha,4)
  2652.                     dearc(afname,0)
  2653.                     isarc:=TRUE
  2654.                 ELSE
  2655.                     IF stricmp('.lzh',lha,4)
  2656.                         dearc(afname,0)
  2657.                         isarc:=TRUE
  2658.                     ELSE
  2659.                         IF stricmp('.lzx',lha,4)
  2660.                             dearc(afname,1)
  2661.                             isarc:=TRUE
  2662.                         ELSE
  2663.                             isarc:=0
  2664.                         ENDIF
  2665.                     ENDIF
  2666.                 ENDIF
  2667.                 rr:=0
  2668.                 IF (lock:=Lock(afname,SHARED_LOCK))
  2669.                     Examine(lock,fib)
  2670.                     IF (fh:=Open(afname,MODE_OLDFILE))
  2671.                         IF (buf:=New(fib.size+32))
  2672.                             playgad:=findgadget(gh,ppgad)
  2673.                             Gt_SetGadgetAttrsA(playgad,gh.wnd,0,[GA_DISABLED,TRUE,TAG_END])
  2674.                             quitgad:=findgadget(gh,qqgad)
  2675.                             Gt_SetGadgetAttrsA(quitgad,gh.wnd,0,[GA_DISABLED,TRUE,TAG_END])
  2676.                             getgad:=findgadget(gh,ghgetgad)
  2677.                             Gt_SetGadgetAttrsA(getgad,gh.wnd,0,[GA_DISABLED,TRUE,TAG_END])
  2678.                             afnamegad:=findgadget(gh,ghafnamegad)
  2679.                             Gt_SetGadgetAttrsA(afnamegad,gh.wnd,0,[GA_DISABLED,TRUE,TAG_END])
  2680.                             Read(fh,buf,fib.size)
  2681.                             setlistvlabels(gh,cellistv,-1)
  2682.                             END ezclist
  2683.                             NEW ezclist.new()
  2684.                             ezclist.add('    Cel List:')
  2685.                             setlistvlabels(gh,cellistv,ezclist.head())
  2686.                             splitname(afname,dir,fi)
  2687.                             rr:=parsecnf(buf,fib.size,dir)
  2688.                             Close(fh);fh:=0
  2689.                             fileloaded:=TRUE
  2690.                             playgad:=findgadget(gh,ppgad)
  2691.                             Gt_SetGadgetAttrsA(playgad,gh.wnd,0,[GA_DISABLED,FALSE,TAG_END])
  2692.                             quitgad:=findgadget(gh,qqgad)
  2693.                             Gt_SetGadgetAttrsA(quitgad,gh.wnd,0,[GA_DISABLED,FALSE,TAG_END])
  2694.                             getgad:=findgadget(gh,ghgetgad)
  2695.                             Gt_SetGadgetAttrsA(getgad,gh.wnd,0,[GA_DISABLED,FALSE,TAG_END])
  2696.                             afnamegad:=findgadget(gh,ghafnamegad)
  2697.                             Gt_SetGadgetAttrsA(afnamegad,gh.wnd,0,[GA_DISABLED,FALSE,TAG_END])
  2698.                             Dispose(buf);buf:=0
  2699.                         ENDIF
  2700.                     ENDIF
  2701.                     UnLock(lock);lock:=0
  2702.                 ENDIF
  2703.             ENDIF
  2704.             WHILE res<=0
  2705.                 afnamegad:=findgadget(gh,ghafnamegad)
  2706.                 RefreshGList(afnamegad,gh.wnd,0,1)
  2707.                 Wait(gh.sig)
  2708.                 stepon:=0
  2709.                 res:=guimessage(gh)
  2710.                 IF res>0
  2711.                     continue:=res
  2712.                     IF (res=1) THEN rr:=1
  2713.                 ENDIF
  2714.                 IF stepon THEN res:=5
  2715.             ENDWHILE
  2716.             IF res=5 THEN res:=0
  2717.         UNTIL continue
  2718.     ENDIF
  2719. EXCEPT DO
  2720.     IF isarc THEN cleanuparc()
  2721.     IF gh
  2722.         rememberwin(gh.wnd,GH_MAIN)
  2723.         cleangui(gh)
  2724.         gh:=0
  2725.     ENDIF
  2726.     IF pppp THEN END pppp;pppp:=0
  2727.     IF wscr THEN UnlockPubScreen(0,wscr)
  2728.     IF fib THEN FreeDosObject(DOS_FIB,fib)
  2729.     IF lock THEN UnLock(lock)
  2730.     IF buf THEN Dispose(buf)
  2731.     END ezclist;ezclist:=0
  2732.     END errlist;errlist:=0
  2733.     IF fh THEN Close(fh)
  2734.     IF exception="Egui" THEN ReThrow()
  2735.     IF exception="bigg" THEN ReThrow()
  2736.     IF exception="file" THEN RETURN "file"
  2737. ENDPROC rr
  2738.  
  2739. PROC getscreenname(str)
  2740.     DEF res
  2741.     DEF buf:PTR TO nameinfo
  2742.     IF (buf:=New(1000))
  2743.         res:=GetDisplayInfoData(0,buf,1000,DTAG_NAME,tmodeid)
  2744.         IF res
  2745.             StrCopy(str,buf.name)
  2746.             IF (prefhand) THEN settext(prefhand,modename,str)
  2747.         ENDIF
  2748.         Dispose(buf)
  2749.     ENDIF
  2750. ENDPROC
  2751.  
  2752. PROC loadprefs(name)
  2753.     DEF buffy:PTR TO LONG,fh,i
  2754.     buffy:=New(800)
  2755.     fh:=Open(name,MODE_OLDFILE)
  2756.     IF fh
  2757.         Read(fh,buffy,100)
  2758.         Close(fh)
  2759.         modeid:=buffy[0]
  2760.         screenos:=buffy[1]
  2761.         screenas:=buffy[2]
  2762.         animspeed:=buffy[3]
  2763.         usebounds:=buffy[4]
  2764.         usehand:=buffy[5]
  2765.         usefollow:=buffy[7]
  2766.         usesnap:=buffy[8]
  2767.         usenasty:=buffy[9]
  2768.         useregions:=buffy[10]
  2769.         usewb:=buffy[11]
  2770.         usewin:=buffy[12]
  2771.     ENDIF
  2772.     fh:=Open('ENV:PlayFKiss.windows',MODE_OLDFILE)
  2773.     IF fh
  2774.         Read(fh,buffy,48)
  2775.         Close(fh)
  2776.         FOR i:=0 TO 2
  2777.             wx[i]:=buffy[(i*4)]
  2778.             wy[i]:=buffy[(i*4)+1]
  2779.             ww[i]:=buffy[(i*4)+2]
  2780.             wh[i]:=buffy[(i*4)+3]
  2781.         ENDFOR
  2782.     ENDIF
  2783.     Dispose(buffy)
  2784. ENDPROC
  2785.  
  2786. PROC saveprefs(name)
  2787.     DEF buffy:PTR TO LONG,fh
  2788.     buffy:=New(100)
  2789.     buffy[0]:=modeid
  2790.     buffy[1]:=screenos
  2791.     buffy[2]:=screenas
  2792.     buffy[3]:=animspeed
  2793.     buffy[4]:=usebounds
  2794.     buffy[5]:=usehand
  2795.     buffy[7]:=usefollow
  2796.     buffy[8]:=usesnap
  2797.     buffy[9]:=usenasty
  2798.     buffy[10]:=useregions
  2799.     buffy[11]:=usewb
  2800.     buffy[12]:=usewin
  2801.     fh:=Open(name,MODE_NEWFILE)
  2802.     IF fh
  2803.         Write(fh,buffy,100)
  2804.         Close(fh)
  2805.     ENDIF
  2806. ENDPROC
  2807.  
  2808. PROC savewinpos()
  2809.     savewp('ENV:PlayFKiss.windows')
  2810.     savewp('ENVARC:PlayFKiss.windows')
  2811. ENDPROC
  2812. PROC savewp(name)
  2813.     DEF buffy:PTR TO LONG,fh,i
  2814.     buffy:=New(800)
  2815.     FOR i:=0 TO 2
  2816.         buffy[(i*4)]:=wx[i]
  2817.         buffy[(i*4)+1]:=wy[i]
  2818.         buffy[(i*4)+2]:=ww[i]
  2819.         buffy[(i*4)+3]:=wh[i]
  2820.     ENDFOR
  2821.     fh:=Open(name,MODE_NEWFILE)
  2822.     IF fh
  2823.         Write(fh,buffy,48)
  2824.         Close(fh)
  2825.     ENDIF
  2826. ENDPROC
  2827.  
  2828. PROC setspeed(dum,val)
  2829.     tanimspeed:=val*10
  2830. ENDPROC
  2831.  
  2832. PROC prefs()
  2833.     DEF res=0
  2834.     prefhand:=0
  2835.     tmodeid:=modeid
  2836.     tscreenos:=screenos
  2837.     tscreenas:=screenas
  2838.     tanimspeed:=animspeed
  2839.     tusebounds:=usebounds
  2840.     tusehand:=usehand
  2841.     tuseregions:=useregions
  2842.     tusefollow:=usefollow
  2843.     tusesnap:=usesnap
  2844.     tusenasty:=usenasty
  2845.     tusewb:=usewb
  2846.     tusewin:=usewin
  2847.     getscreenname(sname)
  2848.     prefhand:=guiinit('PlayFKiss Prefs',
  2849.             [ROWS,
  2850.                 [COLS,
  2851.                     [TEXT,0,'Display:',0,1],
  2852.                     [BEVELR,
  2853.                         modename:=[TEXT,sname,0,0,1]
  2854.                     ],
  2855.                     [BUTTON,{getsmr},'Choose...']
  2856.                 ],
  2857.                 [COLS,
  2858.                     [TEXT,'     ','Anim Speed',0,1],
  2859.                     [SLIDE,{setspeed},0,FALSE,0,20,animspeed/10,20,'\d[2]']
  2860.                 ],
  2861.                 [EQCOLS,
  2862.                     [EQROWS,
  2863.                         [CHECK,{bound},'Enforce Bounds:',tusebounds,TRUE],
  2864.                         [CHECK,{optfollow},'Follow Mouse:',tusefollow,TRUE],
  2865. ->                        [CHECK,{hand},'Hand Pointer:',tusehand,TRUE],
  2866.                         [CHECK,{snap},'Elastic Fix:',tusesnap,TRUE]
  2867.                     ],
  2868.                     [EQROWS,
  2869.                         [CHECK,{uwb},'Window on Workbench:',tusewb,TRUE],
  2870.                         [CHECK,{uwin},'Remember Windows:',tusewin,TRUE],
  2871.                         [CHECK,{nasty},'Use CyberGFX:',tusenasty,TRUE]
  2872.                     ]
  2873.                 ],
  2874.                 [COLS,
  2875.                         [CYCLE,{optreg},'Update:',['Object Regions','Cel Regions','Simple Square',0],tuseregions],
  2876.                         [CYCLE,{hand},'Pointer:',['System','Hand','Blank',0],tusehand]
  2877.                 ],
  2878.                 [BAR],
  2879.                 [COLS,
  2880.                     [BUTTON,4,'Save'],
  2881.                     [SPACEH],
  2882.                     [BUTTON,2,'Use'],
  2883.                     [SPACEH],
  2884.                     [BUTTON,3,'Cancel']
  2885.                 ]
  2886.             ]
  2887.         ,0,IF scr THEN scr ELSE 0)
  2888.     sizewin(prefhand.wnd,GH_PREFS)
  2889.     res:=-1
  2890.     IF prefhand
  2891.         WHILE res<0
  2892.             Wait(prefhand.sig)
  2893.             res:=guimessage(prefhand)
  2894.         ENDWHILE
  2895.         rememberwin(prefhand.wnd,GH_PREFS)
  2896.         cleangui(prefhand)
  2897.   ENDIF
  2898.   IF (res=2) OR (res=4)
  2899.          modeid:=tmodeid
  2900.         screenos:=tscreenos
  2901.         screenas:=tscreenas
  2902.         animspeed:=tanimspeed
  2903.         usebounds:=tusebounds
  2904.         usehand:=tusehand
  2905.         useregions:=tuseregions
  2906.         usefollow:=tusefollow
  2907.         usesnap:=tusesnap
  2908.         usenasty:=tusenasty
  2909.         usewb:=tusewb
  2910.         usewin:=tusewin
  2911.     ENDIF
  2912.   IF res=4
  2913.         saveprefs('ENVARC:PlayFKISS.prefs')
  2914.       res:=2
  2915.   ENDIF
  2916.     IF res=2
  2917.         saveprefs('ENV:PlayFKISS.prefs')
  2918.     ENDIF
  2919. ENDPROC
  2920.  
  2921. PROC bound(ac,val)
  2922.     tusebounds:=val
  2923. ENDPROC
  2924. PROC hand(ac,val)
  2925.     tusehand:=val
  2926. ENDPROC
  2927. PROC uwin(ac,val)
  2928.     tusewin:=val
  2929. ENDPROC
  2930. PROC optreg(ac,val)
  2931.     tuseregions:=val
  2932. ENDPROC
  2933. PROC optfollow(ac,val)
  2934.     tusefollow:=val
  2935. ENDPROC
  2936. PROC snap(ac,val)
  2937.     tusesnap:=val
  2938. ENDPROC
  2939. PROC nasty(ac,val)
  2940.     tusenasty:=val
  2941. ENDPROC
  2942. PROC uwb(ac,val)
  2943.     tusewb:=val
  2944. ENDPROC
  2945.  
  2946. PROC getsmr()
  2947.     DEF ret
  2948.     ret:=AslRequest(smr,
  2949.      [IF scr THEN ASLSM_SCREEN ELSE ASLSM_PUBSCREENNAME,IF scr THEN scr ELSE 'Workbench',
  2950.         ASLSM_DOOVERSCANTYPE,TRUE,
  2951.         ASLSM_DOAUTOSCROLL,TRUE,
  2952.         ASLSM_INITIALDISPLAYID,tmodeid,
  2953.         ASLSM_INITIALOVERSCANTYPE,tscreenos,
  2954.         ASLSM_INITIALAUTOSCROLL,tscreenas,
  2955.         NIL])
  2956.     IF ret
  2957.         tmodeid:=smr.displayid
  2958.         tscreenas:=smr.autoscroll
  2959.         tscreenos:=smr.overscantype
  2960.         getscreenname(sname)
  2961.     ENDIF
  2962. ENDPROC
  2963.  
  2964. PROC getfile()
  2965.     DEF ii
  2966.     DEF file[500]:STRING,dir[500]:STRING
  2967.     splitname(afname,dir,file)
  2968.     ii:=AslRequest(filereq,[ASL_HAIL,'Select .CNF file',
  2969.                         ASL_OKTEXT,'Open',ASL_FILE,file,ASL_DIR,dir,
  2970.                         ASLFR_DOPATTERNS,TRUE,ASLFR_DOSAVEMODE,FALSE,FILF_NEWIDCMP,TRUE,NIL,NIL])
  2971.     IF ii
  2972.         StrCopy(afname,filereq.drawer,ALL)
  2973.         eaddpart(afname,filereq.file,490)
  2974.         setstr(gh,ghafnamegad,afname)
  2975.         stepon:=1
  2976.     ENDIF
  2977. ENDPROC
  2978.  
  2979. PROC loadstr()
  2980.     stepon:=1
  2981. ENDPROC
  2982.  
  2983. PROC parsecnf(buf:PTR TO CHAR,lof,dirname) HANDLE
  2984.     DEF mark=0,smark,omark,result
  2985.     DEF objn,celn,fixval
  2986.     DEF lc
  2987.     DEF res=0,nres=0
  2988.     DEF str[12]:STRING
  2989.     DEF numstr[12]:STRING
  2990.     DEF alstr[100]:STRING
  2991.     DEF celname[100]:STRING,cel:PTR TO cel
  2992.     DEF obj:PTR TO obj
  2993.     DEF i
  2994.     DEF tmpstr[500]:STRING
  2995.     DEF cset=-1,ccel=-1
  2996.     DEF celsetfound,celpalfound
  2997.     DEF w,h
  2998.     DEF aa
  2999.     DEF acurobj=0:PTR TO event
  3000.     DEF curc,tcels
  3001.  
  3002.     linenum:=1
  3003.     events:=0;setnum(gh,evgad,events)
  3004.     commands:=0;setnum(gh,cogad,commands)
  3005.     palset:=0
  3006.     totmem:=0
  3007.     mode:=0
  3008.     fkissfound:=0
  3009.     freecels()
  3010.     freeobjs()
  3011.     freepals()
  3012.     freeevents()
  3013.     FOR i:=0 TO 9
  3014.         pb[i]:=0
  3015.     ENDFOR
  3016.     pppp.setlevel(0,10)
  3017.     pppp.text('Parsing .cnf file...')
  3018.  
  3019.     envw:=448
  3020.     envh:=320
  3021.  
  3022.     REPEAT
  3023.         lc:=buf[mark]
  3024.         SELECT lc
  3025.         CASE "$"
  3026.             smark:=mark+1
  3027.             cset:=cset+1
  3028.             ccel:=-1
  3029.             smark,result:=scan_value(buf,smark,numstr,lof)
  3030.             IF result=0
  3031.                 StrToLong(numstr,{i})
  3032.                 pb[cset]:=i
  3033.                 ccel:=parsesetline(buf,smark+1,lof,cset,ccel,gh)
  3034.             ELSE
  3035.                 egerr()
  3036.             ENDIF
  3037.         CASE " "
  3038.             IF cset>=0
  3039.                 ccel:=parsesetline(buf,mark+1,lof,cset,ccel,gh)
  3040.             ENDIF
  3041.         CASE ";"
  3042.             IF buf[mark+1]="@"
  3043.                 IF stricmp('EventHandler',buf+mark+2,12)
  3044.                     fkissfound:=TRUE
  3045.                 ENDIF
  3046.                 IF fkissfound
  3047.                     mark,acurobj:=parsefkiss(buf,mark+2,lof,acurobj,dirname)
  3048.                 ENDIF
  3049.             ENDIF
  3050.         CASE "%"
  3051.             StrCopy(celname,'')
  3052.             scan_string(buf,mark+1,celname,lof)
  3053.             IF celname
  3054.                 load_palet(dirname,celname,gh)
  3055.                 palset:=palset+1
  3056.                 setnum(gh,colgad,palset*16)
  3057.             ENDIF
  3058.         CASE "["
  3059.             smark:=mark+1
  3060.             smark,result:=scan_value(buf,smark,numstr,lof)
  3061.             IF result=0
  3062.                 StrToLong(numstr,{backcolor})
  3063.             ELSE
  3064.                 backcolor:=0
  3065.             ENDIF
  3066.         CASE "("
  3067.             smark:=mark+1
  3068.             smark,result:=scan_value(buf,smark,numstr,lof)
  3069.             IF result=0
  3070.                 StrToLong(numstr,{envw})
  3071.                 envw:=((envw+31)/32)*32
  3072.                 smark,result:=scan_value(buf,smark+1,numstr,lof)
  3073.                 IF result=0
  3074.                     StrToLong(numstr,{envh})
  3075.                 ELSE
  3076.                     egerr()
  3077.                 ENDIF
  3078.             ELSE
  3079.                 egerr()
  3080.             ENDIF
  3081.         CASE "#"
  3082.             cel:=0
  3083.             fixval:=0
  3084.             StrCopy(celname,'')
  3085.             smark:=mark+1
  3086.             StrCopy(numstr,'')
  3087.             smark,result:=scan_value(buf,smark,numstr,lof)
  3088.             IF result=0
  3089.                 StrToLong(numstr,{objn})
  3090.                 IF buf[smark]="."
  3091.                     smark:=smark+1
  3092.                     StrCopy(numstr,'')
  3093.                     smark,result:=scan_value(buf,smark,numstr,lof)
  3094.                     IF result=0
  3095.                         StrToLong(numstr,{fixval})
  3096.                     ELSE
  3097.                         egerr()
  3098.                     ENDIF
  3099.                 ENDIF
  3100.                 smark:=scan_nonspace(buf,smark,lof)
  3101.                 smark:=scan_string(buf,smark,celname,lof)
  3102.                 
  3103.                 IF (StrLen(celname))
  3104. ->                    setlistvlabels(gh,cellistv,-1)
  3105.                     cel:=alloccel()
  3106.                     IF (cel)
  3107.                         cel.realname(celname)
  3108.                         cel.setobj(objn)
  3109.                         cel.fix:=fixval
  3110.                         obj:=allocobj(objn)
  3111.                         obj.fix:=bigger(fixval,obj.fix)
  3112.                         obj.oldfix:=obj.fix
  3113.  
  3114. /*
  3115.                         StringF(tmpstr,'\s  #\d',celname,cel.obj)
  3116.                         ezclist.add(tmpstr)
  3117.                         setlistvlabels(gh,cellistv,ezclist.head())
  3118. */
  3119.                         setnum(gh,ncelgad,countcels())
  3120.                         setnum(gh,nobjgad,countobjs())
  3121.                         FOR i:=0 TO 9
  3122.                             cel.setset(i,1)
  3123.                         ENDFOR
  3124.                         celsetfound:=FALSE;celpalfound:=FALSE
  3125.                         omark:=smark
  3126.                         WHILE ((buf[smark]<>10) AND (buf[smark]<>13) AND (smark<lof) AND (buf[smark]<>";"))
  3127.                             IF ((buf[smark]="*") AND (celpalfound=FALSE))
  3128.                                 celpalfound:=TRUE
  3129.                                 smark:=smark+1
  3130.                                 smark,result:=scan_value(buf,smark,numstr,lof)
  3131.                                 IF result=0
  3132.                                     StrToLong(numstr,{i})
  3133.                                     cel.setpalette(i)
  3134.                                 ELSE
  3135.                                     egerr()
  3136.                                 ENDIF
  3137.                             ENDIF
  3138.                             IF ((buf[smark]=":") AND (celsetfound=FALSE))
  3139.                                 celsetfound:=TRUE
  3140.                                 FOR i:=0 TO 9
  3141.                                     cel.setset(i,0)
  3142.                                 ENDFOR
  3143.                                 smark:=smark+1
  3144.                                 WHILE ((buf[smark]<>10) AND (buf[smark]<>13) AND (smark<lof) AND (buf[smark]<>";"))
  3145.                                     StrCopy(numstr,buf+smark,1)
  3146.                                     IF ((buf[smark]>="0") AND (buf[smark]<="9"))
  3147.                                         StrToLong(numstr,{i})
  3148.                                         cel.setset(i,1)
  3149.                                     ENDIF
  3150.                                     smark:=smark+1
  3151.                                 ENDWHILE
  3152.                                 smark:=smark-1
  3153.                             ENDIF
  3154.                             smark:=smark+1
  3155.                         ENDWHILE
  3156.                         i:=omark
  3157.                         smark:=i
  3158.                         WHILE ((buf[i]<>10) AND (buf[i]<>13))
  3159.                             IF buf[i]=";"
  3160.                                 smark:=i
  3161.                             ENDIF
  3162.                             i:=i+1
  3163.                         ENDWHILE
  3164.                         IF (smark<(i-1))
  3165.                             StrCopy(tmpstr,buf+smark+1,i-smark-1)
  3166.                             cel.comment(tmpstr)
  3167.                         ELSE
  3168.                             cel.comment('-')
  3169.                         ENDIF
  3170.                     ENDIF                    
  3171.                 ELSE
  3172.                     egerr()
  3173.                 ENDIF
  3174.             ELSE
  3175.                 egerr()
  3176.             ENDIF
  3177.         ENDSELECT
  3178.         mark:=seekcrlf(buf,mark,lof);linenum:=linenum+1
  3179.         nres:=guimessage(gh)
  3180.         IF nres>0 THEN res:=nres
  3181.     UNTIL (mark>=lof)
  3182.     pppp.text('Loading cel files...')
  3183.     tcels:=countcels()
  3184.     curc:=0
  3185.     FOR i:=MAXCELS TO 0 STEP -1
  3186.         cel:=cels[i]
  3187.         IF cel
  3188.             setloaded:=TRUE
  3189.             IF ((i/3)=((i+2)/3))
  3190.                 pppp.setlevel(smaller(curc,tcels),bigger(tcels,1))
  3191.             ENDIF
  3192.             curc:=curc+1
  3193.             w,h:=cel.load(dirname)
  3194.             setlistvlabels(gh,cellistv,-1)
  3195.             IF w>0 AND h>0
  3196.                 StringF(tmpstr,'\s    #\d (\dx\d) *\d [\d\d\d\d\d\d\d\d\d\d] ;\s',cel.realname,cel.obj,w,h,cel.palet_num,cel.sets[0],cel.sets[1],cel.sets[2],cel.sets[3],cel.sets[4],cel.sets[5],cel.sets[6],cel.sets[7],cel.sets[8],cel.sets[9],cel.comment)
  3197.                 totmem:=totmem+(w*h)
  3198.                 IF usewb THEN totmem:=totmem+(w*h)
  3199.                 setnum(gh,memgad,totmem)
  3200.             ELSE
  3201.                 StringF(tmpstr,'*\s -BAD FILE/NOT FOUND',celname)
  3202.             ENDIF
  3203.             ezclist.add(tmpstr)
  3204.             setlistvlabels(gh,cellistv,ezclist.head())
  3205.             nres:=guimessage(gh)
  3206.             IF nres>0 THEN res:=nres
  3207.         ENDIF
  3208.     ENDFOR
  3209.     pppp.setlevel(0,10)
  3210.     pppp.text('Ready!')
  3211. EXCEPT DO
  3212.     NOP
  3213. ENDPROC res
  3214.  
  3215. PROC parsefkiss(buf:PTR TO CHAR,mark,lof,bcurobj,dirname)
  3216.     DEF m,x,y
  3217.     DEF com:PTR TO command
  3218.     DEF eol=0
  3219.     DEF lol=0
  3220.     DEF cb,ce
  3221.     DEF cmpstr[100]:STRING
  3222.     DEF numb,num[100]:STRING
  3223.     DEF soundstr[1000]:STRING
  3224.  
  3225.     DEF foundcel[100]:STRING,foundobj
  3226.  
  3227.     lol:=findlol(buf,mark)
  3228.     m:=mark
  3229.     ce:=bcurobj
  3230.  
  3231.     IF lol>mark
  3232.         REPEAT
  3233.             StrCopy(cmpstr,buf+m,80)
  3234.             StrCopy(foundcel,'')
  3235.             IF stricmp(cmpstr,'initialize',10)    -> >> INITIALIZE event
  3236.                 ce:=makeevent(EV_INIT,-1,0)
  3237.                 m:=findchar(buf,m,")")
  3238.             ENDIF
  3239.             IF stricmp(cmpstr,'begin',5)        -> >>  BEGIN event
  3240.                 ce:=makeevent(EV_BEGIN,-1,0)
  3241.                 m:=findchar(buf,m,")")
  3242.             ENDIF
  3243.             IF stricmp(cmpstr,'end',3)            -> >>  END event
  3244.                 ce:=makeevent(EV_END,-1,0)
  3245.                 m:=findchar(buf,m,")")
  3246.             ENDIF
  3247.             IF stricmp(cmpstr,'alarm(',6)        -> >>  ALARM event
  3248.                 MidStr(num,cmpstr,6,20)
  3249.                 StrToLong(num,{numb})
  3250.                 ce:=makeevent(EV_ALARM,numb,0)
  3251.                 m:=findchar(buf,m,")")
  3252.             ENDIF
  3253.             IF stricmp(cmpstr,'set(',4)        -> >>  SET event
  3254.                 MidStr(num,cmpstr,4,20)
  3255.                 StrToLong(num,{numb})
  3256.                 ce:=makeevent(EV_SET,numb,0)
  3257.                 m:=findchar(buf,m,")")
  3258.             ENDIF
  3259.             IF stricmp(cmpstr,'catch(',6)        -> >>  CATCH event
  3260.                 foundobj:=parseparas(buf,m+6,foundcel)
  3261.                 IF foundobj<>-1
  3262.                     ce:=makeevent(EV_CATCH,foundobj,0)
  3263.                 ELSE
  3264.                     ce:=makeevent(EV_CATCH,-1,foundcel)
  3265.                 ENDIF
  3266.                 m:=findchar(buf,m,")")
  3267.             ENDIF
  3268.             IF stricmp(cmpstr,'fixcatch(',9)        -> >>  FIXCATCH event
  3269.                 foundobj:=parseparas(buf,m+9,foundcel)
  3270.                 IF foundobj<>-1
  3271.                     ce:=makeevent(EV_FIXCATCH,foundobj,0)
  3272.                 ELSE
  3273.                     ce:=makeevent(EV_FIXCATCH,-1,foundcel)
  3274.                 ENDIF
  3275.                 m:=findchar(buf,m,")")
  3276.             ENDIF
  3277.             IF stricmp(cmpstr,'press(',6)        -> >>  PRESS event
  3278.                 foundobj:=parseparas(buf,m+6,foundcel)
  3279.                 IF foundobj<>-1
  3280.                     ce:=makeevent(EV_PRESS,foundobj,0)
  3281.                 ELSE
  3282.                     ce:=makeevent(EV_PRESS,-1,foundcel)
  3283.                 ENDIF
  3284.                 m:=findchar(buf,m,")")
  3285.             ENDIF
  3286.             IF stricmp(cmpstr,'drop(',5)        -> >>  DROP event
  3287.                 foundobj:=parseparas(buf,m+5,foundcel)
  3288.                 IF foundobj<>-1
  3289.                     ce:=makeevent(EV_DROP,foundobj,0)
  3290.                 ELSE
  3291.                     ce:=makeevent(EV_DROP,-1,foundcel)
  3292.                 ENDIF
  3293.                 m:=findchar(buf,m,")")
  3294.             ENDIF
  3295.             IF stricmp(cmpstr,'fixdrop(',5)        -> >>  FIXDROP event
  3296.                 foundobj:=parseparas(buf,m+5,foundcel)
  3297.                 IF foundobj<>-1
  3298.                     ce:=makeevent(EV_FIXDROP,foundobj,0)
  3299.                 ELSE
  3300.                     ce:=makeevent(EV_FIXDROP,-1,foundcel)
  3301.                 ENDIF
  3302.                 m:=findchar(buf,m,")")
  3303.             ENDIF
  3304.             IF stricmp(cmpstr,'release(',8)        -> >>  RELEASE event
  3305.                 foundobj:=parseparas(buf,m+8,foundcel)
  3306.                 IF foundobj<>-1
  3307.                     ce:=makeevent(EV_RELEASE,foundobj,0)
  3308.                 ELSE
  3309.                     ce:=makeevent(EV_RELEASE,-1,foundcel)
  3310.                 ENDIF
  3311.                 m:=findchar(buf,m,")")
  3312.             ENDIF
  3313.             IF stricmp(cmpstr,'unfix(',6)        -> >>  UNFIX event
  3314.                 foundobj:=parseparas(buf,m+6,foundcel)
  3315.                 IF foundobj<>-1
  3316.                     ce:=makeevent(EV_UNFIX,foundobj,0)
  3317.                 ELSE
  3318.                     ce:=makeevent(EV_UNFIX,-1,foundcel)
  3319.                 ENDIF
  3320.                 m:=findchar(buf,m,")")
  3321.             ENDIF
  3322.             IF stricmp(cmpstr,'timer(',6)        -> >>  TIMER command
  3323.                 x,y:=parsecoords(buf,m+6)
  3324.                 addcommand(ce,CO_TIMER,0,0,x,y)
  3325.                 m:=findchar(buf,m,")")
  3326.             ENDIF
  3327.             IF stricmp(cmpstr,'move(',5)        -> >>  TIMER command
  3328.                 foundobj:=parseparas(buf,m+5,foundcel)
  3329.                 m:=findchar(buf,m,",")
  3330.                 x,y:=parsecoords(buf,m+1)
  3331.                 IF foundobj<>-1
  3332.                     addcommand(ce,CO_MOVE,foundobj,0,x,y)
  3333.                 ELSE
  3334.                     addcommand(ce,CO_MOVE,-1,foundcel,x,y)
  3335.                 ENDIF
  3336.                 m:=findchar(buf,m,")")
  3337.             ENDIF
  3338.             IF stricmp(cmpstr,'altmap(',7)        -> >>  ALTMAP command
  3339.                 foundobj:=parseparas(buf,m+7,foundcel)
  3340.                 IF foundobj<>-1
  3341.                     addcommand(ce,CO_ALTMAP,foundobj,0)
  3342.                 ELSE
  3343.                     addcommand(ce,CO_ALTMAP,-1,foundcel)
  3344.                 ENDIF
  3345.                 m:=findchar(buf,m,")")
  3346.             ENDIF
  3347.             IF stricmp(cmpstr,'unmap(',6)        -> >>  UNMAP command
  3348.                 foundobj:=parseparas(buf,m+6,foundcel)
  3349.                 IF foundobj<>-1
  3350.                     addcommand(ce,CO_UNMAP,foundobj,0)
  3351.                 ELSE
  3352.                     addcommand(ce,CO_UNMAP,-1,foundcel)
  3353.                 ENDIF
  3354.                 m:=findchar(buf,m,")")
  3355.             ENDIF
  3356.             IF stricmp(cmpstr,'map(',4)        -> >>  MAP command
  3357.                 foundobj:=parseparas(buf,m+4,foundcel)
  3358.                 IF foundobj<>-1
  3359.                     addcommand(ce,CO_MAP,foundobj,0)
  3360.                 ELSE
  3361.                     addcommand(ce,CO_MAP,-1,foundcel)
  3362.                 ENDIF
  3363.                 m:=findchar(buf,m,")")
  3364.             ENDIF
  3365.             IF stricmp(cmpstr,'sound(',6)        -> >>  SOUND command
  3366.                 foundobj:=parseparas(buf,m+6,foundcel)
  3367.                 IF foundcel<>-1
  3368.                     com:=addcommand(ce,CO_SOUND,-1,foundcel)
  3369.                     IF com
  3370.                         StrCopy(soundstr,dirname)
  3371.                         eaddpart(soundstr,com.cel,990)
  3372.                         com.sound:=NewDTObjectA(soundstr,[DTA_GROUPID,GID_SOUND,DTA_SOURCETYPE,DTST_FILE,NIL])
  3373.                     ENDIF                    
  3374.                 ENDIF
  3375.                 m:=findchar(buf,m,")")
  3376.             ENDIF
  3377.             m:=m+1
  3378.         UNTIL ((eol<>0) OR (m>=lof) OR (m>=lol))
  3379.     ENDIF
  3380. ENDPROC m,ce
  3381.  
  3382. PROC parseparas(buf:PTR TO CHAR,mark,str)
  3383.     DEF m
  3384.     DEF lc
  3385.     DEF hey[100]:STRING,hv
  3386.     m:=mark
  3387.     IF buf[m]=34
  3388.         lc:=findchar(buf,m+1,34)
  3389.         MidStr(str,buf,m+1,lc-m-1)
  3390. ->WriteF('"\s"\n',str)
  3391.         RETURN -1
  3392.     ELSE
  3393.         IF buf[m]="#"
  3394.             lc:=findchar(buf,m+1,"#")
  3395.             MidStr(hey,buf,m+1,lc-m-1)
  3396.             StrToLong(hey,{hv})
  3397. ->WriteF('#\d\n',hv)
  3398.             RETURN hv
  3399.         ELSE
  3400.             egerr()
  3401.         ENDIF
  3402.     ENDIF
  3403. ENDPROC
  3404.  
  3405. PROC parsecoords(buf:PTR TO CHAR,mark)
  3406.     DEF x=0,y=0,m,s=0
  3407.     DEF st[100]:STRING
  3408.     m:=mark
  3409.     s:=InStr(buf,',',mark)
  3410.     IF s>mark
  3411.         MidStr(st,buf,mark,s-mark)
  3412.         StrToLong(st,{x})
  3413.         MidStr(st,buf,s+1)
  3414.         StrToLong(st,{y})
  3415.     ENDIF
  3416. ENDPROC x,y
  3417.  
  3418. PROC findchar(buf:PTR TO CHAR,mark,char)
  3419.     WHILE (buf[mark]<>char)
  3420.         mark:=mark+1
  3421.     ENDWHILE
  3422. ENDPROC mark
  3423.  
  3424. PROC makeevent(type,obj,cel)
  3425.     DEF ev=0:PTR TO event
  3426.     NEW ev
  3427.     ev.obj:=obj
  3428.     ev.type:=type
  3429.     ev.counter:=0
  3430.     IF cel
  3431.         ev.cel:=String(StrLen(cel))
  3432.         StrCopy(ev.cel,cel)
  3433.     ENDIF
  3434.     newList(ev.commands)
  3435.     AddTail(eventlist,ev)
  3436.     events:=events+1
  3437.     setnum(gh,evgad,events)
  3438. ENDPROC ev
  3439.  
  3440. PROC addcommand(ev:PTR TO event,type,obj,cel,x=0,y=0)
  3441.     DEF co:PTR TO command
  3442.     IF ev
  3443.         NEW co
  3444.         co.obj:=obj
  3445.         co.type:=type
  3446.         co.x:=x
  3447.         co.y:=y
  3448.         IF cel
  3449.             co.cel:=String(StrLen(cel))
  3450.             StrCopy(co.cel,cel)
  3451.         ENDIF
  3452.         AddTail(ev.commands,co)
  3453.         commands:=commands+1
  3454.         setnum(gh,cogad,commands)
  3455.     ENDIF
  3456. ENDPROC co
  3457.  
  3458. PROC findeventtype(type,obj=-1,cel=-1)
  3459.     DEF ev:PTR TO event,next
  3460.     DEF str1[500]:STRING
  3461.     DEF str2[500]:STRING
  3462.     ev:=eventlist.head
  3463.     REPEAT
  3464.         next:=ev.ln.succ
  3465.         IF (next)
  3466.             IF ev.type=type
  3467.                 IF obj=-1
  3468.                     IF ((ev.cel>0) AND (cel>0))
  3469.                         StrCopy(str1,ev.cel)
  3470.                         StrCopy(str2,cel)
  3471.                         UpperStr(str1)
  3472.                         UpperStr(str2)
  3473.                         IF StrCmp(str1,str2)
  3474.                             RETURN ev
  3475.                         ENDIF
  3476.                     ELSE
  3477.                         IF cel=-1 THEN RETURN ev
  3478.                     ENDIF
  3479.                 ELSE
  3480.                     IF obj=ev.obj THEN RETURN ev
  3481.                 ENDIF
  3482.             ENDIF            
  3483.         ENDIF
  3484.         ev:=next
  3485.     UNTIL (next=0)
  3486. ENDPROC 0
  3487.  
  3488. PROC findnamedcel(name)
  3489.     DEF i,cel:PTR TO cel
  3490.     DEF str1[200]:STRING,str2[200]:STRING
  3491.     StrCopy(str1,name,ALL)
  3492.     UpperStr(str1)
  3493.     FOR i:=MAXCELS TO 0 STEP -1
  3494.         cel:=cels[i]
  3495.         IF cel
  3496.             StrCopy(str2,cel.realname,ALL)
  3497.             UpperStr(str2)
  3498.             IF StrCmp(str1,str2)
  3499.                 RETURN i
  3500.             ENDIF
  3501.         ENDIF
  3502.     ENDFOR
  3503. ENDPROC 0
  3504.  
  3505. PROC findlol(buf:PTR TO CHAR,mark)
  3506.     DEF m
  3507.     m:=mark
  3508.     WHILE ((buf[m]<>10) AND (buf[m]<>13) AND (buf[m]<>";"))
  3509.         m:=m+1
  3510.     ENDWHILE
  3511. ENDPROC m
  3512.  
  3513. PROC load_palet(dir,fn,gh)
  3514.     DEF fh
  3515.     DEF buf:PTR TO CHAR
  3516.     DEF p,c,r,g,b,len,loop
  3517.     DEF name[500]:STRING
  3518.     DEF byte_l,byte_h
  3519.     DEF buffer:PTR TO CHAR,lof
  3520.     
  3521.     StrCopy(name,dir)
  3522.     AddPart(name,fn,490)
  3523.     fh:=Open(name,MODE_OLDFILE)
  3524.     IF fh
  3525.         StrCopy(palet[palset].name,name)
  3526.         lof:=FileLength(name)
  3527.         IF lof>0
  3528.             IF (buffer:=New(lof))
  3529.                 Read(fh,buffer,lof)
  3530.                 buf:=buffer
  3531.                 IF Long(buffer)="KiSS"
  3532.                     IF buf[4]=FILE_MARK_PALET
  3533.                         palet[palset].color_num:=buf[9]*256+buf[8]
  3534.                         IF (palet[palset].color_num>16)
  3535.                             mode:=16
  3536.                         ELSE
  3537.                             mode:=limit(mode+1,1,16)
  3538.                         ENDIF
  3539.                         palet[palset].palet_num:=buf[11]*256+buf[10]
  3540.                         palet[palset].bit_per_pixel:=buf[5]
  3541.                     ENDIF
  3542.                     buf:=buf+32
  3543.                 ELSE
  3544.                     palet[palset].color_num:=GS1_MAX_COLOR
  3545.                     palet[palset].palet_num:=10
  3546.                     palet[palset].bit_per_pixel:=12
  3547.                     mode:=limit(mode+1,1,16)
  3548.                 ENDIF
  3549.                 p:=0
  3550.                 WHILE (p<palet[palset].palet_num)
  3551.                     palet[palset].color[p]:=New(12*palet[palset].color_num+50)
  3552.                     c:=0
  3553.                     WHILE (c<palet[palset].color_num)
  3554.                         IF palet[palset].bit_per_pixel=12
  3555.                             byte_l:=buf[0]
  3556.                             byte_h:=buf[1]
  3557.                             buf:=buf+2
  3558.                             r:=((byte_l/$10) AND $F)*$1111
  3559.                             g:=(byte_h AND $F)*$1111
  3560.                             b:=(byte_l AND $F)*$1111
  3561.                             r:=(Shl(Shl(r,8),8) OR r)
  3562.                             g:=(Shl(Shl(g,8),8) OR g)
  3563.                             b:=(Shl(Shl(b,8),8) OR b)
  3564.                         ENDIF
  3565.                         IF palet[palset].bit_per_pixel=24
  3566.                             r:=buf[0]
  3567.                             g:=buf[1]
  3568.                             b:=buf[2]
  3569.                             buf:=buf+3
  3570.                             FOR loop:=0 TO 2
  3571.                                 r:=Shl(r,8) OR r
  3572.                                 g:=Shl(g,8) OR g
  3573.                                 b:=Shl(b,8) OR b
  3574.                             ENDFOR
  3575.                         ENDIF
  3576.                         PutLong(palet[palset].color[p]+(12*c),r)
  3577.                         PutLong(palet[palset].color[p]+(12*c)+4,g)
  3578.                         PutLong(palet[palset].color[p]+(12*c)+8,b)
  3579.                         c:=c+1
  3580.                     ENDWHILE
  3581.                 p:=p+1
  3582.                 ENDWHILE
  3583.             ENDIF
  3584.         ENDIF
  3585.         Close(fh)
  3586.     ELSE
  3587.         pppp.setlevel(0,10)
  3588.         pppp.text('Missing a .kcf file!')
  3589.         DisplayBeep(0)
  3590.         Delay(120)
  3591.     ENDIF
  3592. ENDPROC
  3593.  
  3594. PROC parsesetline(buf:PTR TO CHAR,m,lof,cs,co,gh) HANDLE
  3595.     DEF xxx,yyy
  3596.     DEF oldco
  3597.     DEF mm,mmm
  3598.     DEF res
  3599.     DEF nstr[10]:STRING
  3600.     DEF obj:PTR TO obj
  3601.     oldco:=co
  3602.     WHILE ((buf[m]<>13) AND (buf[m]<>10) AND (buf[m+1]<>13) AND (buf[m+1]<>10) AND (buf[m-1]<>13) AND (buf[m-1]<>10) AND (m<lof))
  3603.         m:=scan_nonspace(buf,m,lof)
  3604.         IF m>=lof THEN Raise(0)
  3605.         StrCopy(nstr,'')
  3606.         IF buf[m]="*"
  3607.             m:=m+1
  3608.             co:=co+1
  3609.         ELSE
  3610.             mmm:=m
  3611.             m,res:=scan_value(buf,m,nstr,lof)
  3612.             IF m=mmm
  3613.                 m:=m+1
  3614.             ELSE
  3615.                 IF res=0
  3616.                     StrToLong(nstr,{xxx})
  3617.                     IF buf[m]=","
  3618.                         m:=m+1
  3619.                         StrCopy(nstr,'')
  3620.                         m,res:=scan_value(buf,m,nstr,lof)
  3621.                         IF res=0
  3622.                             StrToLong(nstr,{yyy})
  3623.                             co:=co+1
  3624.                             obj:=objs[co]
  3625.                             IF obj
  3626.                                 obj.setx(cs,xxx)
  3627.                                 obj.sety(cs,yyy)
  3628.                                 obj.setux(cs,xxx)
  3629.                                 obj.setuy(cs,yyy)
  3630.                             ENDIF
  3631.                         ELSE
  3632.                             egerr()
  3633.                             Raise(0)
  3634.                         ENDIF
  3635.                     ELSE
  3636.                         egerr()
  3637.                         Raise(0)
  3638.                     ENDIF
  3639.                 ENDIF
  3640.             ENDIF
  3641.         ENDIF
  3642.         IF ((buf[m]=13) OR (buf[m]=10)) THEN m:=lof+100
  3643.     ENDWHILE
  3644.     RETURN co
  3645. EXCEPT
  3646.     NOP
  3647. ENDPROC -1
  3648.  
  3649.  
  3650. PROC retdepth(m)
  3651.     SELECT m
  3652.     CASE 0;RETURN 4
  3653.     CASE 1;RETURN 4
  3654.     CASE 2;RETURN 5
  3655.     CASE 3;RETURN 6
  3656.     CASE 4;RETURN 6
  3657.     CASE 5;RETURN 7
  3658.     CASE 6;RETURN 7
  3659.     CASE 7;RETURN 7
  3660.     CASE 8;RETURN 7
  3661.     ENDSELECT
  3662. ENDPROC 8
  3663.  
  3664. cbuf:
  3665.     LONG    $90909090,$90909090,$90909090,                $00000000,$00000000,$00000000,
  3666.                 $FFFFFFFF,$FFFFFFFF,$FFFFFFFF,                $40404040,$80808080,$A0A0A0A0,
  3667.                 $80808080,$80808080,$80808080,                $B0B0B0B0,$B0B0B0B0,$B0B0B0B0,
  3668.                 $B0B0B0B0,$90909090,$A0A0A0A0,                $FFFFFFFF,$A8A8A8A8,$98989898
  3669.  
  3670. PROC busy()
  3671.     IF win
  3672.         SetWindowPointerA(win,[WA_BUSYPOINTER,TRUE,WA_POINTERDELAY,TRUE,NIL,NIL])
  3673.     ENDIF
  3674. ENDPROC
  3675. PROC ready()
  3676.     IF win
  3677.         SetWindowPointerA(win,[WA_BUSYPOINTER,FALSE,WA_POINTERDELAY,FALSE,NIL,NIL])
  3678.         handme()
  3679.     ENDIF
  3680. ENDPROC
  3681.  
  3682. PROC reportmousemoves(win:PTR TO window)
  3683.     Forbid()
  3684.     win.flags:=win.flags OR WFLG_REPORTMOUSE
  3685.     Permit()
  3686. ENDPROC
  3687. PROC noreportmousemoves(win:PTR TO window);DEF flag
  3688.     Forbid()
  3689.     flag:=win.flags
  3690.     IF (flag AND WFLG_REPORTMOUSE) THEN flag:=flag-WFLG_REPORTMOUSE
  3691.     win.flags:=flag
  3692.     Permit()
  3693. ENDPROC
  3694.  
  3695. PROC handme()
  3696.     IF usehand=1
  3697.         SetWindowPointerA(win,[WA_POINTER,hand1,WA_POINTERDELAY,FALSE,NIL,NIL])
  3698.     ELSE
  3699.         ClearPointer(win)
  3700.     ENDIF
  3701. ENDPROC
  3702.  
  3703. PROC grabme()
  3704.     IF usehand=1
  3705.         SetWindowPointerA(win,[WA_POINTER,hand2,WA_POINTERDELAY,FALSE,NIL,NIL])
  3706.     ELSE
  3707.         IF usehand=2
  3708.             SetWindowPointerA(win,[WA_POINTER,hand3,WA_POINTERDELAY,FALSE,NIL,NIL])
  3709.         ELSE
  3710.             ClearPointer(win)
  3711.         ENDIF
  3712.     ENDIF
  3713. ENDPROC
  3714.  
  3715. PROC sysisize() IS
  3716.  IF scr.flags AND SCREENHIRES THEN SYSISIZE_MEDRES ELSE SYSISIZE_LOWRES
  3717.  
  3718. PROC newimageobject(which) IS
  3719.   NewObjectA(NIL,'sysiclass',
  3720.     [SYSIA_DRAWINFO,dri,SYSIA_WHICH,which,SYSIA_SIZE,sysisize(),NIL])
  3721.  
  3722. PROC newpropobject(freedom,taglist) IS
  3723.   NewObjectA(NIL,'propgclass',
  3724.     [ICA_TARGET,ICTARGET_IDCMP,PGA_FREEDOM,freedom,PGA_NEWLOOK,TRUE,
  3725.      PGA_BORDERLESS,(dri.flags AND DRIF_NEWLOOK) AND (dri.depth<>1),
  3726.      TAG_MORE,taglist])
  3727.  
  3728. PROC newbuttonobject(image:PTR TO object,taglist) IS
  3729.   NewObjectA(NIL,'buttongclass',
  3730.     [ICA_TARGET,ICTARGET_IDCMP,GA_IMAGE,image,TAG_MORE,taglist])
  3731.  
  3732.  
  3733.  
  3734. /*********************************************************************
  3735. ***********             **********************************************
  3736. ***********  I/O Stuff  **********************************************
  3737. ***********             **********************************************
  3738. *********************************************************************/
  3739.  
  3740. PROC seekcrlf(buf:PTR TO CHAR,mark,lof)
  3741.     WHILE ((buf[mark]<>13) AND (buf[mark]<>10) AND (mark<lof))
  3742.         mark:=mark+1
  3743.     ENDWHILE
  3744.     mark:=mark+1
  3745.     IF ((buf[mark]=10) OR (buf[mark]=13)) THEN mark:=mark+1
  3746. ENDPROC mark
  3747.  
  3748. PROC scan_value(buf:PTR TO CHAR,m,str,lof)
  3749.     DEF result=TRUE
  3750.     DEF mm,byte
  3751.     DEF dstr[10]:STRING
  3752.     StrCopy(dstr,'0',1)
  3753.     StrCopy(str,'')
  3754.     mm:=m
  3755.     byte:=buf[m]
  3756.     WHILE ((((byte>="0") AND (byte<="9")) OR (byte="-")) AND (m<lof))
  3757.         PutChar(dstr,byte)
  3758.         StrAdd(str,dstr,1)
  3759.         m:=m+1
  3760.         byte:=buf[m]
  3761.     ENDWHILE
  3762.     IF m<>mm
  3763.         mm:=m
  3764.         result:=FALSE
  3765.     ELSE
  3766.         result:=TRUE
  3767.     ENDIF
  3768. ENDPROC mm,result
  3769.  
  3770. PROC scan_nonspace(buf:PTR TO CHAR,m,lof)
  3771.     WHILE (((buf[m]=9) OR (buf[m]=" ")) AND (lof>m))
  3772.         m:=m+1
  3773.     ENDWHILE
  3774. ENDPROC m
  3775.  
  3776. PROC scan_string(buf:PTR TO CHAR,m,str,lof)
  3777.     DEF dstr[10]:STRING
  3778.     StrCopy(dstr,'0',1)
  3779.     WHILE ((buf[m]<>9) AND (buf[m]<>" ") AND (buf[m]<>13) AND (buf[m]<>10) AND lof>m)
  3780.         PutChar(dstr,buf[m])
  3781.         StrAdd(str,dstr,1)
  3782.         m:=m+1
  3783.     ENDWHILE
  3784. ENDPROC m
  3785.  
  3786. PROC egerr()
  3787.     DEF statusstr[500]:STRING
  3788.     StringF(statusstr,'?Syntax Error:Line #\d',linenum)
  3789.     setlistvlabels(gh,errlistv,-1)
  3790.     errlist.add(statusstr)
  3791.     setlistvlabels(gh,errlistv,errlist.head())
  3792. ENDPROC
  3793.  
  3794. PROC err(msgptr)
  3795.     IF ((aslbase<>0))
  3796.          EasyRequestArgs(win,[20,0,'Error!',msgptr,'Okay'],0,0)
  3797.     ELSE
  3798.         WriteF('\s\n',msgptr)
  3799.     ENDIF
  3800. ENDPROC
  3801.  
  3802. PROC aboutme()
  3803.     err('PlayFKiss is PUBLIC DOMAIN\nWritten in 1996 by\nChad Randall - crandall@msen.com\n\nPlease email suggestions,\nbug reports or KISS dolls!\n\nThanks for supporting the Amiga!')
  3804. ENDPROC
  3805.  
  3806. PROC stricmp(str1,str2,len) IS IF Strnicmp(str1,str2,len)=0 THEN TRUE ELSE FALSE
  3807.  
  3808.  
  3809. PROC runevent(event,obj:PTR TO obj,cel:PTR TO cel)
  3810.     DEF ev=0,res=0
  3811.     IF obj
  3812.         ev:=findeventtype(event,obj.number)
  3813.         IF ev
  3814.             runcommands(ev)
  3815.             res:=TRUE
  3816.         ENDIF
  3817.     ENDIF
  3818.     IF cel
  3819.         IF res=FALSE
  3820.             ev:=findeventtype(event,-1,cel.realname)
  3821.             IF ev
  3822.                 runcommands(ev)
  3823.                 res:=TRUE
  3824.             ENDIF
  3825.         ENDIF
  3826.     ENDIF
  3827.     IF ((res=FALSE) AND (obj=0) AND (cel=0))
  3828.         ev:=findeventtype(event)
  3829.         IF ev
  3830.             runcommands(ev)
  3831.             res:=TRUE
  3832.         ENDIF
  3833.     ENDIF
  3834. ENDPROC res
  3835.  
  3836.  
  3837. /*********************************************************************
  3838. ***********              *********************************************
  3839. ***********  LIST Stuff  *********************************************
  3840. ***********              *********************************************
  3841. *********************************************************************/
  3842.  
  3843. PROC alloccel()
  3844.     DEF cel:PTR TO cel
  3845.     DEF ordinal
  3846.     NEW cel.new()
  3847.     IF cel
  3848.         ordinal:=findemptycel()
  3849.         IF ordinal<>-1
  3850.             cels[ordinal]:=cel
  3851.         ELSE
  3852.             END cel
  3853.             cel:=-1
  3854.         ENDIF
  3855.     ELSE
  3856.         cel:=-1
  3857.     ENDIF
  3858. ENDPROC cel
  3859.  
  3860. PROC allocobj(objn)
  3861.     DEF obj:PTR TO obj
  3862.     NEW obj.new(objn)
  3863.     IF obj
  3864.         IF objs[objn]
  3865.             END obj
  3866.             obj:=objs[objn]
  3867.         ELSE
  3868.             objs[objn]:=obj
  3869.         ENDIF
  3870.     ELSE
  3871.         obj:=-1
  3872.     ENDIF
  3873. ENDPROC obj
  3874.  
  3875. PROC findemptycel()
  3876.     DEF i
  3877.     FOR i:=MAXCELS TO 0 STEP -1
  3878.         IF cels[i]=0 THEN RETURN i
  3879.     ENDFOR
  3880. ENDPROC -1
  3881.  
  3882. PROC countcels()
  3883.     DEF i,count=0
  3884.     FOR i:=MAXCELS TO 0 STEP -1
  3885.         IF cels[i] THEN count:=count+1
  3886.     ENDFOR
  3887. ENDPROC count
  3888.  
  3889. PROC countobjs()
  3890.     DEF i,count=0
  3891.     FOR i:=MAXOBJS TO 0 STEP -1
  3892.         IF objs[i] THEN count:=count+1
  3893.     ENDFOR
  3894. ENDPROC count
  3895.  
  3896. PROC freecels()
  3897.     DEF i
  3898.     FOR i:=MAXCELS TO 0 STEP -1
  3899.         IF cels[i]
  3900.             freecel(cels[i])
  3901.             cels[i]:=0
  3902.         ENDIF
  3903.     ENDFOR
  3904. ENDPROC
  3905.  
  3906. PROC freeobjs()
  3907.     DEF i
  3908.     FOR i:=MAXOBJS TO 0 STEP -1
  3909.         IF objs[i]
  3910.             freeobj(objs[i])
  3911.             objs[i]:=0
  3912.         ENDIF
  3913.     ENDFOR
  3914. ENDPROC
  3915.  
  3916. PROC freecel(cel:PTR TO cel)
  3917.     IF cel THEN END cel
  3918. ENDPROC
  3919.  
  3920. PROC freeobj(obj:PTR TO obj)
  3921.     IF obj THEN END obj
  3922. ENDPROC
  3923.  
  3924. /*********************************************************************
  3925. ***********             **********************************************
  3926. ***********  OOP Stuff  **********************************************
  3927. ***********             **********************************************
  3928. *********************************************************************/
  3929.  
  3930.  
  3931. PROC new() OF listnodes IS newList(self.lh)
  3932. PROC head() OF listnodes IS self.lh
  3933. PROC end() OF listnodes
  3934.     DEF node:PTR TO ln
  3935.     DEF next=0
  3936.     IF isempty(self)=0
  3937.         node:=self.lh.head
  3938.         WHILE (node)
  3939.             next:=node.succ
  3940.             IF next
  3941.                 Remove(node)
  3942.                 DisposeLink(node.name)
  3943.                 END node
  3944.             ENDIF
  3945.             node:=next
  3946.         ENDWHILE
  3947.     ENDIF
  3948. ENDPROC
  3949. PROC add(name) OF listnodes
  3950.     DEF node:PTR TO ln
  3951.     DEF str
  3952.     NEW node
  3953.     str:=String(StrLen(name))
  3954.     StrCopy(str,name)
  3955.     node.name:=str
  3956.     AddTail(self.lh,node)
  3957. ENDPROC node
  3958.  
  3959. PROC end() OF obj
  3960. ENDPROC
  3961.  
  3962. PROC end() OF cel
  3963.     IF self.realname THEN DisposeLink(self.realname)
  3964.     IF self.comment THEN DisposeLink(self.comment)
  3965.     IF self.buf THEN Dispose(self.buf)
  3966.     IF self.obuf THEN Dispose(self.buf)
  3967.     self.dispose()
  3968. ENDPROC
  3969.  
  3970. PROC dispose() OF cel
  3971. ENDPROC
  3972.  
  3973. PROC realname(name) OF cel
  3974.     DEF str
  3975.     str:=String(StrLen(name))
  3976.     StrCopy(str,name)
  3977.     IF self.realname THEN DisposeLink(self.realname)
  3978.     self.realname:=str
  3979. ENDPROC
  3980.  
  3981. PROC comment(name) OF cel
  3982.     DEF str
  3983.     str:=String(StrLen(name))
  3984.     StrCopy(str,name)
  3985.     IF self.comment THEN DisposeLink(self.comment)
  3986.     self.comment:=str
  3987. ENDPROC
  3988.  
  3989. PROC setw(x) OF cel;self.w:=x;ENDPROC
  3990. PROC seth(x) OF cel;self.h:=x;ENDPROC
  3991. PROC setox(x) OF cel;self.ox:=x;ENDPROC
  3992. PROC setoy(x) OF cel;self.oy:=x;ENDPROC
  3993. PROC setpalette(x) OF cel;self.palet_num:=x;ENDPROC
  3994. PROC setset(set,flag) OF cel;self.sets[set]:=flag;ENDPROC
  3995. PROC setobj(x) OF cel;self.obj:=x;ENDPROC
  3996. PROC new() OF cel
  3997.     self.mapped:=CMAP_SHOW
  3998. ENDPROC
  3999. PROC new(x) OF obj; self.number:=x;ENDPROC
  4000.  
  4001. PROC setx(set,x) OF obj
  4002.     self.x[set]:=x
  4003. ENDPROC
  4004. PROC sety(set,y) OF obj
  4005.     self.y[set]:=y
  4006. ENDPROC
  4007. PROC setux(set,x) OF obj
  4008.     self.ux[set]:=x
  4009. ENDPROC
  4010. PROC setuy(set,y) OF obj
  4011.     self.uy[set]:=y
  4012. ENDPROC
  4013.  
  4014. PROC remember(set) OF obj
  4015.     self.lastx:=self.x[set]
  4016.     self.lasty:=self.y[set]
  4017.     self.rubx:=self.x[set]
  4018.     self.ruby:=self.y[set]
  4019. ENDPROC
  4020.  
  4021. PROC undo() OF obj
  4022.     DEF x,y
  4023.     x:=self.lastx;y:=self.lasty
  4024.     self.remember(curset)
  4025.     self.forcemove(x,y,TRUE)
  4026. ENDPROC
  4027.  
  4028. PROC forcemove(x,y,flag) OF obj
  4029.     IF (((self.x[curset]<>x) OR (self.y[curset]<>y)) OR (flag=TRUE))
  4030.         IF flag THEN prechange()
  4031.         self.movequick(x,y)
  4032.         IF flag THEN postchange()
  4033.     ENDIF
  4034. ENDPROC
  4035.  
  4036. PROC move(x,y,flag) OF obj
  4037.     DEF nx,ny,dif
  4038.     IF (self.fix>0)
  4039.         dif:=limit(6-self.fix,0,5)
  4040.         nx:=limit(x,self.rubx-dif,self.rubx+dif)
  4041.         ny:=limit(y,self.ruby-dif,self.ruby+dif)
  4042.     ELSE
  4043.         nx:=x;ny:=y
  4044.     ENDIF
  4045.     self.forcemove(nx,ny,flag)
  4046. ENDPROC
  4047.  
  4048. PROC movequick(x,y) OF obj
  4049.     DEF cel:PTR TO cel
  4050.     DEF obj:PTR TO obj
  4051.     DEF i
  4052.     IF usebounds
  4053.         x:=bigger(0,smaller(x,envw-self.width()))
  4054.         y:=bigger(0,smaller(y,envh-self.height()))
  4055.     ENDIF
  4056.     FOR i:=0 TO MAXCELS
  4057.         cel:=cels[i]
  4058.         IF cel
  4059.             IF (cel.obj>=0)
  4060.                 obj:=objs[cel.obj]
  4061.                 IF (obj)
  4062.                     IF (obj=self)
  4063.                         IF cel.mapped<>CMAP_HIDE
  4064.                             orcel(cel,obj,TRUE)
  4065.                         ENDIF
  4066.                     ENDIF
  4067.                 ENDIF
  4068.             ENDIF
  4069.         ENDIF
  4070.     ENDFOR
  4071.     self.setx(curset,x)
  4072.     self.sety(curset,y)
  4073.     FOR i:=0 TO MAXCELS
  4074.         cel:=cels[i]
  4075.         IF cel
  4076.             IF (cel.obj>=0)
  4077.                 obj:=objs[cel.obj]
  4078.                 IF (obj)
  4079.                     IF (obj=self)
  4080.                         IF cel.mapped<>CMAP_HIDE
  4081.                             orcel(cel,obj,TRUE)
  4082.                         ENDIF
  4083.                     ENDIF
  4084.                 ENDIF
  4085.             ENDIF
  4086.         ENDIF
  4087.     ENDFOR
  4088. ENDPROC
  4089.  
  4090. PROC width() OF obj
  4091.     DEF w=0,i,cel:PTR TO cel
  4092.     FOR i:=0 TO MAXCELS
  4093.         cel:=cels[i]
  4094.         IF cel
  4095.             IF cel.obj=self.number
  4096.                 w:=bigger(w,cel.ox+cel.w)
  4097.             ENDIF
  4098.         ENDIF
  4099.     ENDFOR
  4100. ENDPROC w
  4101.  
  4102. PROC height() OF obj
  4103.     DEF h=0,i,cel:PTR TO cel
  4104.     FOR i:=0 TO MAXCELS
  4105.         cel:=cels[i]
  4106.         IF cel
  4107.             IF cel.obj=self.number
  4108.                 h:=bigger(h,cel.oy+cel.h)
  4109.             ENDIF
  4110.         ENDIF
  4111.     ENDFOR
  4112. ENDPROC h
  4113.  
  4114. PROC recolor() OF cel
  4115.     DEF y,a=0,w
  4116.     w:=(self.w*self.h)
  4117.     IF ((usewb<>0) OR (onwb<>0))
  4118.         IF self.obuf=0
  4119.             self.obuf:=New((self.w*self.h)+64)
  4120.             CopyMem(self.buf,self.obuf,(self.w*self.h))
  4121.         ENDIF
  4122.     ENDIF
  4123.     FOR y:=1 TO w
  4124.         self.buf[a]:=apens[self.obuf[a]]
  4125.         a:=a+1
  4126.     ENDFOR
  4127. ENDPROC
  4128.  
  4129. PROC load(dir) OF cel HANDLE
  4130.     DEF name[500]:STRING
  4131.     DEF w=-1,h=-1,x,y
  4132.     DEF fh=0
  4133.     DEF fib=0:PTR TO fileinfoblock
  4134.     DEF lock=0
  4135.     DEF buf=0:PTR TO CHAR
  4136.     DEF nbuf=0:PTR TO CHAR
  4137.     DEF tbuf=0:PTR TO CHAR
  4138.     DEF p1:PTR TO CHAR,p2:PTR TO CHAR
  4139.     DEF leftedge=0
  4140. ->    DEF xfib:PTR TO xpkfib
  4141.     DEF xbuf=0,xbuflen=0
  4142.  
  4143. ->    NEW xfib
  4144.     tbuf:=FastNew(10)
  4145.     StrCopy(name,dir)
  4146.     eaddpart(name,self.realname,490)
  4147.     IF self.buf THEN Dispose(self.buf);self.buf:=0
  4148.     IF self.obuf THEN Dispose(self.obuf);self.obuf:=0
  4149.     IF (fib:=AllocDosObject(DOS_FIB,0))=0 THEN Raise("err")
  4150.     IF (lock:=Lock(name,SHARED_LOCK))=0 THEN Raise("file")
  4151.     Examine(lock,fib)
  4152.     IF (fh:=Open(name,MODE_OLDFILE))=0 THEN Raise("file")
  4153.     IF xpkbase
  4154.         Read(fh,tbuf,4)
  4155.         Seek(fh,0,OFFSET_BEGINNING)
  4156.         IF ((tbuf[0]="X") AND (tbuf[1]="P") AND (tbuf[2]="K"))
  4157.             XpkUnpack([XPK_INNAME,name,XPK_GETOUTBUF,{xbuf},XPK_GETOUTBUFLEN,{xbuflen},TAG_END]:LONG)
  4158.             IF ((xbuf<>0) AND (xbuflen>0))
  4159.                 IF (buf:=New(xbuflen+32))
  4160.                     CopyMem(xbuf,buf,xbuflen)
  4161.                     fib.size:=xbuflen-XPK_MARGIN
  4162.                 ENDIF
  4163.                 FreeMem(xbuf,xbuflen)
  4164.                 IF buf=0 THEN Raise("MEM")
  4165.             ELSE
  4166.                 IF (buf:=New(fib.size+32))=0 THEN Raise("MEM")    
  4167.                 Read(fh,buf,fib.size)
  4168.             ENDIF
  4169.         ELSE
  4170.             IF (buf:=New(fib.size+32))=0 THEN Raise("MEM")    
  4171.             Read(fh,buf,fib.size)
  4172.         ENDIF
  4173.     ELSE
  4174.         IF (buf:=New(fib.size+32))=0 THEN Raise("MEM")    
  4175.         Read(fh,buf,fib.size)
  4176.     ENDIF
  4177.     IF Long(buf)="KiSS"
  4178.         IF (buf[4]=FILE_MARK_CELL)
  4179.             self.setw(buf[9]*256+buf[8])
  4180.             self.seth(buf[11]*256+buf[10])
  4181.             self.setox(buf[13]*256+buf[12])
  4182.             self.setoy(buf[15]*256+buf[14])
  4183.             self.bit_per_pixel:=buf[5]
  4184.             nbuf:=buf+32
  4185.         ENDIF
  4186.     ELSE
  4187.         self.setw(buf[1]*256+buf[0])
  4188.         self.seth(buf[3]*256+buf[2])
  4189.         self.setox(0)
  4190.         self.setoy(0)
  4191.         self.bit_per_pixel:=4
  4192.         w:=self.w
  4193.         h:=self.h
  4194.         IF ((w/2)<>(w+1/2)) THEN w:=w+1
  4195.         w:=w/2
  4196.         IF (((w*h)+4)=fib.size)
  4197.             nbuf:=buf+4
  4198.         ELSE
  4199.         ENDIF
  4200.     ENDIF
  4201.     IF nbuf
  4202.         IF self.bit_per_pixel=4
  4203.             self.w:=((self.w+1)/2)*2
  4204.             leftedge:=TRUE
  4205.         ENDIF
  4206.         w:=self.w
  4207.         h:=self.h
  4208.         self.buf:=New((w*h)+64)
  4209.         IF usewb THEN self.obuf:=New((w*h)+64)
  4210.         IF (self.buf)
  4211.             IF self.bit_per_pixel=4
  4212.                 p1:=nbuf
  4213.                 p2:=self.buf
  4214.                 FOR x:=0 TO self.h-1
  4215.                     FOR y:=0 TO self.w-1 STEP 2
  4216.                         p2[0]:=(p1[0] AND $F0/$10)
  4217.                         IF p2[0]>0 THEN p2[0]:=p2[0]+(16*self.palet_num)
  4218.                         p2[1]:=(p1[0] AND $F)
  4219.                         IF p2[1]>0 THEN p2[1]:=p2[1]+(16*self.palet_num)
  4220.                         p1:=p1+1
  4221.                         p2:=p2+2
  4222.                     ENDFOR
  4223.                 ENDFOR
  4224.                 IF leftedge
  4225. /*
  4226.                     FOR y:=0 TO self.h-1
  4227.                         p2:=self.buf+(self.w*y)
  4228.                         p2[self.w-1]:=0
  4229.                     ENDFOR
  4230. */
  4231.                 ENDIF
  4232.             ELSE
  4233.                 CopyMem(nbuf,self.buf,w*h)
  4234.                 IF self.palet_num>0
  4235.                     p2:=self.buf
  4236.                     FOR y:=self.buf TO self.buf+(w*h)-1
  4237.                         IF p2[y]>0
  4238.                             p2[y]:=(p2[y]+(16*self.palet_num))
  4239.                         ENDIF
  4240.                     ENDFOR
  4241.                 ENDIF
  4242.             ENDIF
  4243.             IF usewb THEN CopyMem(self.buf,self.obuf,(w*h))
  4244.         ELSE
  4245.             w:=-1
  4246.         ENDIF
  4247.     ENDIF
  4248. EXCEPT DO
  4249. ->    END xfib
  4250.     IF tbuf THEN FastDispose(tbuf,10)
  4251.     IF fib THEN FreeDosObject(DOS_FIB,fib)
  4252.     IF lock THEN UnLock(lock)
  4253.     IF buf THEN Dispose(buf)
  4254.     IF fh THEN Close(fh)
  4255. ENDPROC w,h
  4256.  
  4257. PROC setfix(val) OF obj
  4258.     DEF ev=0
  4259.     IF ((val=0) AND (self.fix>0))
  4260.         IF (runevent(EV_UNFIX,self,0)) THEN catchobj:=self
  4261.     ENDIF
  4262.     self.fix:=bigger(val,0)
  4263. ENDPROC
  4264.  
  4265. PROC countmembers() OF obj
  4266.     DEF cel:PTR TO cel,i,mem=0
  4267.     FOR i:=0 TO MAXCELS
  4268.         cel:=cels[i]
  4269.         IF cel
  4270.             IF self.number=cel.obj
  4271.                 mem:=mem+1
  4272.             ENDIF
  4273.         ENDIF
  4274.     ENDFOR
  4275. ENDPROC mem
  4276.  
  4277.  
  4278. hand1dataa:
  4279.   INT $0000,$6000,$7000,$781C,$3CEE,$1EF6,$0F7E,$07FE
  4280.   INT $03FE,$01FC,$01FA,$0EFE,$1FDC,$1838,$0000
  4281. hand1datab:
  4282.   INT $6000,$9000,$E81C,$B4EA,$5BD5,$2DEB,$16BF,$0BFB
  4283.   INT $05FB,$03BE,$0FDF,$11FD,$2FBA,$37FC,$3878
  4284.  
  4285. hand2dataa:
  4286.   INT $0000,$0000,$0000,$001C,$00EE,$06F6,$077E,$07FE
  4287.   INT $0BFE,$0DFC,$0DFA,$06FE,$07DC,$0038,$0000
  4288. hand2datab:
  4289.   INT $0000,$0000,$001C,$00EA,$07D5,$0DEB,$0EBF,$1BFB
  4290.   INT $15FB,$1BBE,$17DF,$0FFD,$0BBA,$07FC,$0078
  4291.  
  4292. hand3dataa:
  4293.     LONG %10000000000000000000000000000000
  4294.     LONG %00000000000000000000000000000000
  4295. hand3datab:
  4296.     LONG %10000000000000000000000000000000
  4297.     LONG %00000000000000000000000000000000
  4298.  
  4299. hand4dataa:
  4300.   INT $07C0,$1FF0,$3FF8,$7FFC,$7CFC,$F9FE,$F3FE,$F7DE
  4301.   INT $FF9E,$FF3E,$7E7C,$7FFC,$3FF8,$1FF0,$07C0
  4302. hand4datab:
  4303.   INT $07C0,$1830,$2008,$4384,$4484,$8902,$9232,$9452
  4304.   INT $9892,$8122,$4244,$4384,$2008,$1830,$07C0
  4305.  
  4306. PROC min_size(fh) OF pi_gauge
  4307.     DEF w,h
  4308.     h:=fh+4
  4309.     w:=10*StrLen(self.string)
  4310. ENDPROC w,h
  4311.  
  4312. PROC new(string) OF pi_gauge
  4313.     self.string:=String(StrLen(string))
  4314.     StrCopy(self.string,string)
  4315. ENDPROC
  4316.  
  4317. PROC end() OF pi_gauge
  4318.     IF self.string THEN DisposeLink(self.string)
  4319. ENDPROC
  4320.  
  4321. PROC draw(win:PTR TO window) OF pi_gauge
  4322.     DEF drawinfo:PTR TO drawinfo
  4323.     DEF visual=0,scr=0
  4324.     DEF newx,w,h
  4325.     IF win
  4326.         scr:=win.wscreen
  4327.         IF scr
  4328.             visual:=GetVisualInfoA(scr,NIL)
  4329.             IF visual
  4330.             drawinfo:=GetScreenDrawInfo(win.wscreen)
  4331.                 IF drawinfo
  4332.                     IF self.curlevel>0
  4333.                         IF ((self.top-self.curlevel)>0)
  4334.                             newx:=(((self.w-7)*100)/(10000/(bigger((self.curlevel*100/(self.top)),1))))
  4335.                             drawbevelbox(visual,win.rport,self.x,self.y,self.w,self.h,1,TRUE,-1)
  4336.                             SetDrMd(win.rport,RP_JAM2)
  4337.                             SetAPen(win.rport,drawinfo.pens[FILLPEN])
  4338.                             RectFill(win.rport,self.x+3,self.y+2,self.x+newx+3,self.y+self.h-3)
  4339.                         ENDIF
  4340.                     ENDIF
  4341.  
  4342.                     IF (self.string)
  4343.                         IF self.curlevel=0
  4344.                             drawbevelbox(visual,win.rport,self.x,self.y,self.w,self.h,1,TRUE,0)
  4345.                         ENDIF
  4346.                         w,h:=fontsize2(win.rport,self.string,drawinfo.font,0)
  4347.                         SetFont(win.rport,drawinfo.font)
  4348.                         SetDrMd(win.rport,RP_JAM1)
  4349.                         Move(win.rport,self.x+((self.w)/2)-(w/2),self.y+drawinfo.font.baseline+1)
  4350.                         SetAPen(win.rport,drawinfo.pens[TEXTPEN])
  4351.                         Text(win.rport,self.string,StrLen(self.string))
  4352.                     ENDIF
  4353.                     FreeScreenDrawInfo(scr,drawinfo)
  4354.                 ENDIF
  4355.                 FreeVisualInfo(visual)
  4356.             ENDIF
  4357.         ENDIF
  4358.     ENDIF
  4359. ENDPROC
  4360.  
  4361. PROC render(x,y,xs,ys,win:PTR TO window) OF pi_gauge
  4362.     self.x:=x
  4363.     self.y:=y
  4364.     self.w:=xs
  4365.     self.h:=ys
  4366.     self.draw(win)
  4367. ENDPROC
  4368.  
  4369. PROC will_resize() OF pi_gauge IS RESIZEX
  4370.  
  4371. PROC text(string) OF pi_gauge
  4372.     IF gh
  4373.         IF self.string
  4374.             DisposeLink(self.string)
  4375.             self.string:=String(StrLen(string))
  4376.             StrCopy(self.string,string)
  4377.         ENDIF
  4378.         self.draw(gh.wnd)    
  4379.     ENDIF
  4380. ENDPROC
  4381.  
  4382. PROC setlevel(val,top) OF pi_gauge
  4383.     self.curlevel:=smaller(val,top-2)
  4384.     self.top:=bigger(top,1)
  4385.     IF gh
  4386.         self.draw(gh.wnd)
  4387.     ENDIF
  4388. ENDPROC
  4389.  
  4390. PROC dearc(file,type)
  4391.     DEF a=0,l,rxdirname[500]:STRING,rxcommand[1000]:STRING
  4392.     DEF stat,result2
  4393.     pppp.text('Uncompressing Kiss set...')
  4394.     Forbid()
  4395.     REPEAT
  4396.         INC a
  4397.         StringF(rexxname,'PlayFKISS.\d',a)
  4398.     UNTIL (FindPort(rexxname)=0)
  4399.     rexxport,rexxsigbit:=createPort(rexxname,0)
  4400.     rexxsigbit:=Shl(1,rexxsigbit)
  4401.     Permit()
  4402.     a:=0
  4403.     REPEAT
  4404.         StringF(rxdirname,'t:pkt\d',a)
  4405.         l:=CreateDir(rxdirname)
  4406.         a:=a+1
  4407.     UNTIL l
  4408.     UnLock(l)
  4409.     IF type=0
  4410.         StringF(rxcommand,'"ADDRESS COMMAND ''lha e -m \s >NIL: <NIL: \s/''"',file,rxdirname)
  4411.     ELSE
  4412.         StringF(rxcommand,'"ADDRESS COMMAND ''lzx x -m \s >NIL: <NIL: \s/''"',file,rxdirname)
  4413.     ENDIF
  4414.     sendRexxMsg('REXX',rxcommand,0,RXFB_STRING,rexxport,rexxname,0)
  4415.     a:=0
  4416.     WHILE (unconfirmed>0) AND (a<100)
  4417.         REPEAT
  4418.             rexxhand,stat,result2:=handleRexxMsg(rexxport)
  4419.             IF (rexxhand)
  4420.                 replyRexxMsg(rexxhand)
  4421.                 IF unconfirmed=0 THEN a:=100
  4422.             ENDIF
  4423.             Delay(25)
  4424.             a:=a+1
  4425.             IF stat=RXTYPE_REPLY
  4426.                 IF (rexxhand) THEN rexxerror(rexxhand,result2)
  4427.             ENDIF
  4428.             l:=(a AND %11)
  4429.             SELECT l
  4430.             CASE 0;pppp.text('Uncompressing Kiss set... |')
  4431.             CASE 1;pppp.text('Uncompressing Kiss set... /')
  4432.             CASE 2;pppp.text('Uncompressing Kiss set... -')
  4433.             CASE 3;pppp.text('Uncompressing Kiss set... \\')
  4434.             ENDSELECT
  4435.         UNTIL ((stat=RXTYPE_NOMSG) OR (a>100))
  4436.     ENDWHILE
  4437.     IF unconfirmed>0 THEN err('REXX command failed!')
  4438.     StrCopy(oldafile,afname)
  4439.     StrCopy(afname,rxdirname)
  4440.     discovercnffile()
  4441.     deletePort(rexxport)
  4442. ENDPROC
  4443.  
  4444. PROC discovercnffile()
  4445.     DEF error,first=0
  4446.     DEF apath=NIL:PTR TO anchorpath
  4447.     DEF fileinfo=NIL:PTR TO fileinfoblock
  4448.     DEF    achain=NIL:PTR TO achain
  4449.     DEF names[20]:LIST
  4450.     DEF i,count=0
  4451.     DEF pat[500]:STRING
  4452.  
  4453.     StrCopy(pat,afname)
  4454.     eaddpart(pat,'#?.cnf',490)
  4455.     FOR i:=0 TO 19;names[i]:=String(20);ENDFOR
  4456.     count:=0
  4457.     NEW apath
  4458.  
  4459.     error:=NIL
  4460.     WHILE error=NIL
  4461.         IF (first=FALSE)
  4462.             error:=MatchFirst(pat,apath)
  4463.             first:=TRUE
  4464.         ELSE
  4465.             error:=MatchNext(apath)        
  4466.         ENDIF
  4467.         IF (error=NIL)
  4468.             achain:=apath.last
  4469.             IF (achain)
  4470.                 fileinfo:=achain.info
  4471.                 IF (fileinfo)
  4472.                     IF (fileinfo.direntrytype)<0
  4473.                         StrCopy(names[count],fileinfo.filename)
  4474.                         count:=smaller(count+1,19)
  4475.                     ENDIF
  4476.                 ENDIF
  4477.             ENDIF
  4478.         ENDIF
  4479.     ENDWHILE
  4480.     END apath
  4481.     IF count>0
  4482.         IF count=1
  4483.             eaddpart(afname,names[0],490)
  4484.         ELSE
  4485.             StrCopy(pat,names[0])
  4486.             FOR i:=1 TO count-1
  4487.                 StrAdd(pat,'|')
  4488.                 StrAdd(pat,names[i])
  4489.             ENDFOR
  4490.             i:=EasyRequestArgs(win,[20,0,'Pick a .cnf file.','Choose which .cnf file:',pat],0,0)
  4491.             eaddpart(afname,names[i],490)
  4492.         ENDIF
  4493.     ELSE
  4494.         err('Could not find any .cnf files in archive.')
  4495.     ENDIF
  4496.     FOR i:=0 TO 19;DisposeLink(names[i]);ENDFOR
  4497. ENDPROC
  4498.  
  4499. PROC rexxerror(level,errnum)
  4500.     DEF body[4000]:STRING
  4501.     DEF errptr:PTR TO nexxstr
  4502.  
  4503.     /* ErrorMsg() is not documented (becuase it returns a code in A0 ??) */
  4504.     MOVE.L    rexxsysbase,A6
  4505.     MOVE.L    errnum,D0
  4506.     JSR            -96(A6)        /* ErrorMsg() */
  4507.     MOVE.L    A0,errptr
  4508.  
  4509.     StringF(body,'An AREXX error occured while dearcing.\n\nError Level: \d\nError \d: \s',level,errnum,errptr.buff)
  4510.     err(body)
  4511. ENDPROC
  4512.  
  4513. PROC cleanuparc()
  4514.     DEF d[500]:STRING,f[500]:STRING
  4515.     DEF error,first=0
  4516.     DEF apath=NIL:PTR TO anchorpath
  4517.     DEF fileinfo=NIL:PTR TO fileinfoblock
  4518.     DEF    achain=NIL:PTR TO achain
  4519.     DEF pat[500]:STRING
  4520.     splitname(afname,d,f)
  4521.     IF stricmp(d,'t:pkt',5)
  4522.         pppp.text('Deleting temp files...')
  4523.         StrCopy(pat,d)
  4524.         eaddpart(pat,'#?',490)
  4525.         error:=NIL
  4526.         NEW apath
  4527.         WHILE error=NIL
  4528.             IF (first=FALSE)
  4529.                 error:=MatchFirst(pat,apath)
  4530.                 first:=TRUE
  4531.             ELSE
  4532.                 error:=MatchNext(apath)        
  4533.             ENDIF
  4534.             IF (error=NIL)
  4535.                 achain:=apath.last
  4536.                 IF (achain)
  4537.                     fileinfo:=achain.info
  4538.                     IF (fileinfo)
  4539.                         IF (fileinfo.direntrytype)<0
  4540.                             StrCopy(f,d)
  4541.                             eaddpart(f,fileinfo.filename,490)
  4542.                             DeleteFile(f)
  4543.                         ENDIF
  4544.                     ENDIF
  4545.                 ENDIF
  4546.             ENDIF
  4547.         ENDWHILE
  4548.         END apath
  4549.         DeleteFile(d)
  4550.         StrCopy(afname,ofilename)
  4551.     ENDIF
  4552. ENDPROC
  4553.